{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Deep inside: Autoencoders"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "This notebook is the complement of [this blog post](https://towardsdatascience.com/deep-inside-autoencoders-7e41f319999f)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "4 types of autoencoders are described using the Keras framework and the MNIST dataset"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "1. Vanilla autoencoders\n",
    "2. Multilayer autoencoder\n",
    "3. Convolutional autoencoder\n",
    "4. Regularized autoencoder"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Import the libraries"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Using TensorFlow backend.\n"
     ]
    }
   ],
   "source": [
    "import keras\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline\n",
    "\n",
    "from keras.datasets import mnist\n",
    "from keras.models import Model\n",
    "from keras.layers import Input, add\n",
    "from keras.layers.core import Layer, Dense, Dropout, Activation, Flatten, Reshape\n",
    "from keras import regularizers\n",
    "from keras.regularizers import l2\n",
    "from keras.layers.convolutional import Conv2D, MaxPooling2D, UpSampling2D, ZeroPadding2D\n",
    "from keras.utils import np_utils"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Load the data"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We don't need the labels as the autoencoders are unsupervised network"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "(X_train, _), (X_test, _) = mnist.load_data()\n",
    "\n",
    "X_train = X_train.reshape(X_train.shape[0], 28, 28, 1)\n",
    "X_test = X_test.reshape(X_test.shape[0], 28, 28, 1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Normalize the data"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We want the pixels values between 0 and 1 instead of between 0 and 255"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "X_train shape: (60000, 28, 28, 1)\n",
      "60000 train samples\n",
      "10000 test samples\n"
     ]
    }
   ],
   "source": [
    "X_train = X_train.astype(\"float32\")/255.\n",
    "X_test = X_test.astype(\"float32\")/255.\n",
    "\n",
    "print('X_train shape:', X_train.shape)\n",
    "print(X_train.shape[0], 'train samples')\n",
    "print(X_test.shape[0], 'test samples')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Flatten the images for the Fully-Connected Networks"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "X_train = X_train.reshape((len(X_train), np.prod(X_train.shape[1:])))\n",
    "X_test = X_test.reshape((len(X_test), np.prod(X_test.shape[1:])))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "___"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# **Vanilla Autoencoder**"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Create the network"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The first network is the most simple autoencoder. It has three layers : Input - encoded - decoded"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "input_size = 784\n",
    "hidden_size = 64\n",
    "output_size = 784"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "x = Input(shape=(input_size,))\n",
    "h = Dense(hidden_size, activation='relu')(x)\n",
    "r = Dense(output_size, activation='sigmoid')(h)\n",
    "\n",
    "autoencoder = Model(inputs=x, outputs=r)\n",
    "autoencoder.compile(optimizer='adam', loss='mse')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/svg+xml": [
       "<svg height=\"191pt\" viewBox=\"0.00 0.00 136.36 191.00\" width=\"136pt\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n",
       "<g class=\"graph\" id=\"graph0\" transform=\"scale(1 1) rotate(0) translate(4 187)\">\n",
       "<title>G</title>\n",
       "<polygon fill=\"white\" points=\"-4,4 -4,-187 132.362,-187 132.362,4 -4,4\" stroke=\"none\"/>\n",
       "<!-- 112210716208 -->\n",
       "<g class=\"node\" id=\"node1\"><title>112210716208</title>\n",
       "<polygon fill=\"none\" points=\"0,-146.5 0,-182.5 128.362,-182.5 128.362,-146.5 0,-146.5\" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"64.1812\" y=\"-160.3\">input_1: InputLayer</text>\n",
       "</g>\n",
       "<!-- 112210716376 -->\n",
       "<g class=\"node\" id=\"node2\"><title>112210716376</title>\n",
       "<polygon fill=\"none\" points=\"12.0552,-73.5 12.0552,-109.5 116.307,-109.5 116.307,-73.5 12.0552,-73.5\" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"64.1812\" y=\"-87.3\">dense_1: Dense</text>\n",
       "</g>\n",
       "<!-- 112210716208&#45;&gt;112210716376 -->\n",
       "<g class=\"edge\" id=\"edge1\"><title>112210716208-&gt;112210716376</title>\n",
       "<path d=\"M64.1812,-146.313C64.1812,-138.289 64.1812,-128.547 64.1812,-119.569\" fill=\"none\" stroke=\"black\"/>\n",
       "<polygon fill=\"black\" points=\"67.6813,-119.529 64.1812,-109.529 60.6813,-119.529 67.6813,-119.529\" stroke=\"black\"/>\n",
       "</g>\n",
       "<!-- 112210769120 -->\n",
       "<g class=\"node\" id=\"node3\"><title>112210769120</title>\n",
       "<polygon fill=\"none\" points=\"12.0552,-0.5 12.0552,-36.5 116.307,-36.5 116.307,-0.5 12.0552,-0.5\" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"64.1812\" y=\"-14.3\">dense_2: Dense</text>\n",
       "</g>\n",
       "<!-- 112210716376&#45;&gt;112210769120 -->\n",
       "<g class=\"edge\" id=\"edge2\"><title>112210716376-&gt;112210769120</title>\n",
       "<path d=\"M64.1812,-73.3129C64.1812,-65.2895 64.1812,-55.5475 64.1812,-46.5691\" fill=\"none\" stroke=\"black\"/>\n",
       "<polygon fill=\"black\" points=\"67.6813,-46.5288 64.1812,-36.5288 60.6813,-46.5289 67.6813,-46.5288\" stroke=\"black\"/>\n",
       "</g>\n",
       "</g>\n",
       "</svg>"
      ],
      "text/plain": [
       "<IPython.core.display.SVG object>"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from IPython.display import SVG\n",
    "from keras.utils.vis_utils import model_to_dot\n",
    "\n",
    "SVG(model_to_dot(autoencoder).create(prog='dot', format='svg'))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Train"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train on 60000 samples, validate on 10000 samples\n",
      "Epoch 1/5\n",
      "60000/60000 [==============================] - 2s - loss: 0.0441 - val_loss: 0.0225\n",
      "Epoch 2/5\n",
      "60000/60000 [==============================] - 2s - loss: 0.0174 - val_loss: 0.0130\n",
      "Epoch 3/5\n",
      "60000/60000 [==============================] - 2s - loss: 0.0110 - val_loss: 0.0087\n",
      "Epoch 4/5\n",
      "60000/60000 [==============================] - 2s - loss: 0.0078 - val_loss: 0.0066\n",
      "Epoch 5/5\n",
      "60000/60000 [==============================] - 2s - loss: 0.0062 - val_loss: 0.0055\n"
     ]
    }
   ],
   "source": [
    "epochs = 5\n",
    "batch_size = 128\n",
    "\n",
    "history = autoencoder.fit(X_train, X_train, batch_size=batch_size, epochs=epochs, verbose=1, validation_data=(X_test, X_test))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\nPW/evLR2RKTeZ0obPnx4TJ06Na3/xBNPpLWztbcP6av3kJR87tuyZUv88Y9/LNZrduyxx6a1e3t7\n09oREStXrkzt7y2/xAEAAACogBEHAAAAoAJGHAAAAIAKGHEAAAAAKmDEAQAAAKiAEQcAAACgAkYc\nAAAAgAoYcQAAAAAqYMQBAAAAqIARBwAAAKACRhwAAACAChhxAAAAACpgxAEAAACogBEHAAAAoAJG\nHAAAAIAKGHEAAAAAKmDEAQAAAKiAEQcAAACgAkYcAAAAgAoYcQAAAAAqYMQBAAAAqIARBwAAAKAC\n7UM5uLOzM971rndlnUs8+eSTae1nn302rR0RMX369LR2W1tbsVZ/f3+88MILxXrNRo0aldb+5Cc/\nmdaOiLjhhhtS+yUNHz48pk6dmtbv7e1Na69evTqtHRFx+umnp7X/8Ic/FGuNHTs2Zs6cWazX7Jvf\n/GZa+4QTTkhrR0T87W9/S+2XtP/++6f+rW+88ca09rBhw9LaERGrVq1Kaw8MDBRrtbS0xIgRI4r1\n/ic99NBDqf33vOc9qf3ly5cXa02ZMiWuu+66Yr1mS5YsSWtnnndExMsvv5zWHhwcLNYaM2ZMnHzy\nycV6zTJfw1NOOSWtHRGxffv21P6KFSuKtVpbW6Ozs7NYr9k555yT1r7zzjvT2hERa9euTe2XcuCB\nB8b3vve9tP6pp56a1s7cE/438UscAAAAgAoYcQAAAAAqYMQBAAAAqIARBwAAAKACRhwAAACAChhx\nAAAAACpgxAEAAACogBEHAAAAoAJGHAAAAIAKGHEAAAAAKmDEAQAAAKiAEQcAAACgAkYcAAAAgAoY\ncQAAAAAqYMQBAAAAqIARBwAAAKACRhwAAACAChhxAAAAACpgxAEAAACogBEHAAAAoAJGHAAAAIAK\nGHEAAAAAKmDEAQAAAKhA+1AO3rhxY9x8881Z5xJHHHFEWnvatGlp7YiIkSNHprVbW8ttbdu3b49n\nnnmmWK9ZZnv27Nlp7YiImTNnpvZ/8pOfFGuNGzcuzjzzzGK9Zpdeemlau6enJ60dEXHjjTemtUte\ni9u2bYuFCxcW6zX705/+lNb+zW9+k9aOiGg0Gqn93/72t8VaS5cujVNPPbVYr9mnP/3ptPb27dvT\n2hERp5xySlp73rx5xVrd3d2pf+fvfOc7ae358+entSMifvCDH6T2S1q1alVccsklaf2urq609vLl\ny9PaERHDhw9Pa7e0tBTtlbzPNuvv709rb968Oa0dEfH+978/tf/oo48WazUajRgcHCzWa/aOd7wj\nrb1z5860dkTutf7kk08Wa/X19cVjjz1WrNcs856beZ1H5H7XHQq/xAEAAACogBEHAAAAoAJGHAAA\nAIAKGHEAAAAAKmDEAQAAAKiAEQcAAACgAkYcAAAAgAoYcQAAAAAqYMQBAAAAqIARBwAAAKACRhwA\nAACAChhxAAAAACpgxAEAAACogBEHAAAAoAJGHAAAAIAKGHEAAAAAKmDEAQAAAKiAEQcAAACgAkYc\nAAAAgAoYcQAAAAAqYMQBAAAAqIARBwAAAKACRhwAAACACrQP5eCJEyfGRRddlHUuccstt6S1jz76\n6LR2RMSiRYvS2v39/cVaLS0t0d4+pJd9SGbMmJHW3r59e1o7IqKrqyu1X9KWLVtizpw5af3BwcG0\n9hvf+Ma0dkTE2WefndYu+XcZGBiIlStXFus1+9KXvpTWLvmZ9FqWLVuW2i9p1KhRcdRRR6X1X331\n1bT21KlT09oREffee29ae+fOncVavb298cADDxTrNXvuuefS2gcffHBaOyLiU5/6VGq/pLa2thg7\ndmxaP/O++M53vjOtHRGp95q2trZird27d8fmzZuL9Zpt2LAhrf3mN785rR0R8fjjj6f2S+rr64tH\nH300rb969eq09tq1a9PaEREHHXRQWnvPnj3FWoODg/HKK68U6zVbt25dWrunpyetHZH/eT1//vy9\nOs4vcQAAAAAqYMQBAAAAqIARBwAAAKACRhwAAACAChhxAAAAACpgxAEAAACogBEHAAAAoAJGHAAA\nAIAKGHEAAAAAKmDEAQAAAKiAEQcAAACgAkYcAAAAgAoYcQAAAAAqYMQBAAAAqIARBwAAAKACRhwA\nAACAChhxAAAAACpgxAEAAACogBEHAAAAoAJGHAAAAIAKGHEAAAAAKmDEAQAAAKhA+1AO3rlzZyxe\nvDjrXGLZsmVp7dmzZ6e1IyIuv/zytPbq1auLtXbs2BFPP/10sV6zs88+O6198cUXp7UjIu66667U\n/vz584u12traYuzYscV6za677rq09pIlS9LaERE9PT1p7YGBgWKt/v7+ePHFF4v1mg0ODqa1v/GN\nb6S1IyK++tWvpvZXrlxZrLV58+b4wx/+UKzXrLe3N6196aWXprUjIg444IC0dsnXsKOjI6ZMmVKs\n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\nLkwGJmnpfwAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1a2f2265f8>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "conv_encoder = Model(x, h)\n",
    "encoded_imgs = conv_encoder.predict(X_test)\n",
    "\n",
    "n = 10\n",
    "plt.figure(figsize=(20, 8))\n",
    "for i in range(n):\n",
    "    ax = plt.subplot(1, n, i+1)\n",
    "    plt.imshow(encoded_imgs[i].reshape(4, 16).T)\n",
    "    plt.gray()\n",
    "    ax.get_xaxis().set_visible(False)\n",
    "    ax.get_yaxis().set_visible(False)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Predict on the test set"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "decoded_imgs = autoencoder.predict(X_test)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Plot"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAABHEAAADnCAYAAACZmMoMAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3WmcFNX1//FL1CiIoiCIRlGE4AIKIoILqKi/uOC+xWhM\n4hY1GLe471tionFJSIJiNG4JEneMS1yCRFT0DwoqIAgKiOxCQFRc5/8gL0++9zh1qWm6Z6Z6Pu9H\np7h3umu6+lbVFPfc06ympiYAAAAAAACgcftWQ+8AAAAAAAAAVoyHOAAAAAAAAAXAQxwAAAAAAIAC\n4CEOAAAAAABAAfAQBwAAAAAAoAB4iAMAAAAAAFAAPMQBAAAAAAAoAB7iAAAAAAAAFAAPcQAAAAAA\nAAqAhzgAAAAAAAAFsGpdOjdr1qymUjuCtJqammbleB2OYYNaWFNT07YcL8RxbDiMxarAWKwCjMWq\nwFisAozFqsBYrAKMxaqQaywyEweoPzMaegcAhBAYi0BjwVgEGgfGItA45BqLPMQBAAAAAAAoAB7i\nAAAAAAAAFAAPcQAAAAAAAAqAhzgAAAAAAAAFwEMcAAAAAACAAuAhDgAAAAAAQAHwEAcAAAAAAKAA\nVm3oHUDTdPbZZ1vcvHnzqG2bbbax+LDDDst8jcGDB1v80ksvRW133333yu4iAAAAAACNCjNxAAAA\nAAAACoCHOAAAAAAAAAXAQxwAAAAAAIACYE0c1Jthw4ZZnFrrRn311VeZbSeddJLFe+65Z9Q2cuRI\ni2fOnJl3F9HAunTpEm2/9dZbFp9++ukWDxo0qN72qSlbc801Lb7uuuss1rEXQghjx461+PDDD4/a\nZsyYUaG9AwAAaBjrrruuxR06dMj1M/6e6Mwzz7T4zTfftHjKlClRv/Hjx5eyi6hizMQBAAAAAAAo\nAB7iAAAAAAAAFADpVKgYTZ8KIX8KlabQ/POf/7R4s802i/rtv//+Fnfq1ClqO/rooy2+5pprcr0v\nGt62224bbWs63axZs+p7d5q8DTbYwOITTzzRYp/muN1221m83377RW1//OMfK7R3UD179rT4wQcf\njNo23XTTir3v9773vWh70qRJFr/33nsVe1+smF4jQwhh+PDhFp966qkW33zzzVG/L7/8srI7VoXa\ntWtn8d///neLX3zxxajfkCFDLJ4+fXrF9+trrVq1irZ32WUXi5988kmLP//883rbJ6AIBgwYYPEB\nBxwQte22224Wd+7cOdfr+TSpTTbZxOLVV1898+dWWWWVXK+PpoOZOAAAAAAAAAXAQxwAAAAAAIAC\nIJ0KZdWrVy+LDz744Mx+EyZMsNhPT1y4cKHFy5Yts/jb3/521G/06NEWd+/ePWpr06ZNzj1GY9Kj\nR49o+6OPPrL4oYcequ/daXLatm0bbd95550NtCeoq7322svi1JTscvMpO8cdd5zFRx55ZL3tB/5L\nr31/+tOfMvv94Q9/sPj222+P2j755JPy71iV0ao0IcT3NJq6NG/evKhfQ6VQaQXBEOJzvabDTp06\ntfI7VjBrr712tK0p+t26dbPYV0klNa1x02UYBg4caLGmjocQQvPmzS1u1qzZSr+vr8IKlIqZOAAA\nAAAAAAXAQxwAAAAAAIAC4CEOAAAAAABAATTomji+5LTmIc6ePTtqW758ucV//etfLZ47d27Uj3ze\nhqUliX3uqOaM6/oNc+bMyfXav/jFL6LtrbbaKrPvY489lus10fA0p1zL3oYQwt13313fu9PknHba\naRYfdNBBUVvv3r3r/HpaujaEEL71rf/9X8H48eMt/ve//13n10Zs1VX/dwnfd999G2Qf/FobZ511\nlsVrrrlm1KZrXKEydPxttNFGmf2GDh1qsd5fIdt6661n8bBhw6K21q1bW6xrEf385z+v/I5luPji\niy3u2LFj1HbSSSdZzH3zNx199NEW//KXv4zaNt5441p/xq+d88EHH5R/x1A2en48/fTTK/peb731\nlsX6txDKR0u867k6hHiNVi0LH0IIX331lcU333yzxS+88ELUrzGeJ5mJAwAAAAAAUAA8xAEAAAAA\nACiABk2nuvbaa6PtTTfdNNfP6TTQDz/8MGqrz2lqs2bNstj/LmPGjKm3/WhMHn30UYt1alsI8bFa\ntGhRnV/bl6tdbbXV6vwaaHy22GILi336hZ+yjvK78cYbLdZppaU65JBDMrdnzJhh8fe///2on0/L\nwYr179/f4h133NFifz2qJF9qWdNcW7RoEbWRTlV+vpz8RRddlOvnNFW1pqamrPtUrXr27Gmxn5Kv\nrrzyynrYm2/q2rVrtK0p6A899FDUxrX1mzS95qabbrK4TZs2Ub+s8TJo0KBoW9PDS7nnRT4+dUZT\nozQl5sknn4z6ffrppxYvWbLEYn+d0vvSp556Kmp78803LX755Zctfu2116J+n3zySebrIz9dfiGE\neIzpvab/TuTVp08fi7/44ouobfLkyRaPGjUqatPv3GeffVbSe5eCmTgAAAAAAAAFwEMcAAAAAACA\nAuAhDgAAAAAAQAE06Jo4WlI8hBC22WYbiydNmhS1bbnllhan8pJ32GEHi9977z2Ls0oC1kbz4BYs\nWGCxls/2Zs6cGW031TVxlK5/UapzzjnH4i5dumT201zU2rbReJ177rkW++8M46gyHn/8cYu1BHip\ntJTqsmXLorZNNtnEYi1z+8orr0T9VllllZXej2rn88G1TPS0adMs/tWvflVv+3TggQfW23vhm7be\neutoe7vttsvsq/c2TzzxRMX2qVq0a9cu2j700EMz+x5//PEW631jpek6OM8880xmP78mjl9PEiGc\nffbZFmvJ+Lz8Om977723xb5Mua6fU59raFSL1Do13bt3t1hLS3ujR4+2WP+unD59etSvQ4cOFuta\nqCGUZx1BfJM+Dxg4cKDFfoytvfbatf78+++/H20///zzFr/77rtRm/4Nomsz9u7dO+qn54R99903\nahs/frzFWqa80piJAwAAAAAAUAA8xAEAAAAAACiABk2nevbZZ5PbypeG+5ovb9qjRw+LdVrU9ttv\nn3u/li9fbvGUKVMs9ileOrVKp7Jj5ey3334Wa6nOb3/721G/+fPnW3zBBRdEbR9//HGF9g4ra9NN\nN422e/XqZbGOtxAoxVguu+66a7S9+eabW6zTgfNODfbTRXU6s5bqDCGE3Xff3eJU+eNTTjnF4sGD\nB+faj6bm4osvjrZ1SrlO3fcpbeWm1z7/3WJ6ef1Kpfh4Pu0Aaddff320/cMf/tBivb8MIYT77ruv\nXvbJ69evn8Xrr79+1HbHHXdYfM8999TXLhWGpvqGEMKxxx5ba7/XX3892p43b57Fe+65Z+brt2rV\nymJN1QohhL/+9a8Wz507d8U728T5+/+//e1vFmv6VAhxOnEqxVD5FCrll8tA+d1yyy3RtqbBpcqF\n63ODN954w+ILL7ww6qd/13s77bSTxXofevvtt0f99PmCngNCCOGPf/yjxQ888IDFlU6tZSYOAAAA\nAABAAfAQBwAAAAAAoAAaNJ2qHBYvXhxtjxgxotZ+qVStFJ2q7FO3dOrWsGHDSnp9fJOm1/gplEo/\n85EjR1Z0n1A+Pv1C1WdVj2qnaWv33ntv1Jaanqq0WphOEb3iiiuifqn0RX2Nn/70pxa3bds26nft\ntddavMYaa0Rtf/jDHyz+/PPPV7TbVeWwww6z2FdEmDp1qsX1WclN0+J8+tRzzz1n8X/+85/62qUm\na5dddsls81VvUumM+KaamppoW7/rs2fPjtoqWWGoefPm0bamCvzsZz+z2O/vcccdV7F9qgaaHhFC\nCGuttZbFWs3G37Po9ekHP/iBxT6Fo1OnTha3b98+anvkkUcs3meffSxetGhRrn1vClq2bGmxXzJB\nl11YuHBh1Pbb3/7WYpZWaDz8fZ1WhTrhhBOitmbNmlmsfxf4VPvrrrvO4lKXX2jTpo3FWiX18ssv\nj/rpsi4+FbOhMBMHAAAAAACgAHiIAwAAAAAAUAA8xAEAAAAAACiAwq+JUwnt2rWz+E9/+pPF3/pW\n/MxLy1+Tx1q6hx9+ONr+3ve+V2u/u+66K9r25XZRDFtvvXVmm66LgpWz6qr/O73nXQPHry115JFH\nWuzzzvPSNXGuueYai2+44YaoX4sWLSz234Phw4dbPG3atJL2o6gOP/xwi/UzCiG+PlWarrF09NFH\nW/zll19G/a6++mqLm9r6RfVFS6Jq7Pk1AsaNG1exfWpqBgwYEG1r+XZdC8qv4ZCXrsOy2267RW07\n7LBDrT9z//33l/ReTdXqq68ebeuaQjfeeGPmz2m54r/85S8W67k6hBA222yzzNfQtVoquZ5SkR10\n0EEWn3/++VGblv3u169f1LZkyZLK7hhK4s9j55xzjsW6Bk4IIbz//vsW69q0r7zySknvrWvdbLzx\nxlGb/m35+OOPW+zXwVV+f++++26L63MtQGbiAAAAAAAAFAAPcQAAAAAAAAqAdKpaDBw40GItg+vL\nmU+ePLne9qnabLDBBhb76eA6xVVTOHSafgghLFu2rEJ7h3LT6d/HHnts1Pbaa69Z/PTTT9fbPuG/\ntDS1L0lbagpVFk2L0pScEELYfvvty/peRdWqVatoOyt1IoTSUzVKoeXhNT1v0qRJUb8RI0bU2z41\nVXnHSn1+P6rR7373u2i7f//+Fm+44YZRm5Z616n2BxxwQEnvra/hS4erd955x2Jf4hppWh7c03Q5\nn/KfpVevXrnfe/To0RZzL1u7VKqo3jfOmjWrPnYHK0lTmkL4Ziq2+uKLLyzu06ePxYcddljUb4st\ntqj15z/55JNoe8stt6w1DiG+z11//fUz90nNmzcv2m6oNHJm4gAAAAAAABQAD3EAAAAAAAAKgHSq\nEMLOO+8cbftV0L+mK6WHEMKbb75ZsX2qdg888IDFbdq0yex3zz33WNzUqtJUkz333NPi1q1bR21P\nPvmkxVr1AeXjK+spnapaaZoi4PcptY+XX365xcccc0zZ96sx8RVTvvOd71g8dOjQ+t4d06lTp1r/\nnetg/UulbZSjMhL+a+zYsdH2NttsY3GPHj2itr333ttirbqyYMGCqN+dd96Z67212sn48eMz+734\n4osWc49UN/58qqlvmrLoUza0wubBBx9ssa9mo2PRt5144okW67GeOHFirn1vCnzqjNLxdtlll0Vt\njzzyiMVU5Gs8/vWvf0XbmnqtfyOEEEKHDh0s/v3vf29xKrVU07N86lZKVgrVV199FW0/9NBDFp92\n2mlR25w5c3K/XzkxEwcAAAAAAKAAeIgDAAAAAABQADzEAQAAAAAAKADWxAkh7LvvvtH2aqutZvGz\nzz5r8UsvvVRv+1SNNN+4Z8+emf2ee+45i32uK4qpe/fuFvuc1vvvv7++d6dJOPnkky32ub0NZf/9\n97d42223jdp0H/3+6po41e7DDz+MtjWnX9fkCCFeX2rRokVl3Y927dpF21nrE4waNaqs74va9e3b\n1+Kjjjoqs9+SJUsspvRueS1evNhiXc/Bb5933nkr/V6bbbaZxbqWWAjxOeHss89e6fdqqp555plo\nW8eOrnvj16nJWpfDv97AgQMt/sc//hG1ffe737VY19fQ63ZT17ZtW4v9PYGuHXfppZdGbRdffLHF\nN998s8Va1j2EeN2VqVOnWjxhwoTMferatWu0rX8Xcr5N82W/dT2pddZZJ2rTtWl13doPPvgg6jdz\n5kyL9Tuhf3OEEELv3r3rvL9DhgyJti+88EKLdb2rhsRMHAAAAAAAgALgIQ4AAAAAAEABNNl0qubN\nm1uspepCCOGzzz6zWNN5Pv/888rvWBXxpcN1KpqmrHk6VXjZsmXl3zHUi/bt21vcr18/iydPnhz1\n07J9KB9NXapPOgU6hBC22mori/UckOLL8jalc6+fcqxlgw899NCo7bHHHrP4hhtuqPN7devWLdrW\nFI5NN900astKIWgsqXrVTq+n3/pW9v+/Pf300/WxO6gwTRHxY0/Ttfy5Evn5FNQjjjjCYk3zbtWq\nVeZrDBo0yGKfRrd8+XKLH3zwwahN00X22msvizt16hT1a8pl43/7299afNZZZ+X+OT0//uxnP6s1\n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\n70Vts2bNsvi1116zOFWFQ9M5fKqHjlOfatW3b99a9zd1XazG45Ylq1LVimTdY/i0Cr226uv7an+a\n3us/f/1epKpTpaoCpn6uqPKm4qjUNUjvM/z9n35+eo/qr5/6c/fff3/m66fuUVNt+jtXQyqc/n5Z\nxzOE9P2GtunnnzpPpsZKqmLUyJEjLX744YctPuyww6J++h3ZYIMNojZNjU0t/VBUeq3yKcJ+W+m9\nxTPPPGNx//79o3677rqrxbqcgh+z+jlrCnMI2ZU+9e9Iz39PUhW0iiirOlip1wv9vHwlshEjRljs\n0+rU+++/b/HZZ58dtc2fP9/ivOf8uixBUUnF/7YAAAAAAAA0ATzEAQAAAAAAKAAe4gAAAAAAABRA\nRdbE8aWaNa8xJW/p8FRenebinXvuuRb70nJTp061+Ne//nXUpmsQ5M2PS+1vU+W/B/qZaAlOLfce\nQgg/+9nPLNY8X81bDCFeH8Kv+aHHW4+nX2tD81vbtGlTy2/xX7q+iM9ZbsxSefupMaXbqfGmueGp\nksS6jpVfayNVUjFrbam6lJTPWuOg2taq8mUwhwwZYrEvTb3GGmtYvN9++1ns17rR46vjuS5523rs\n33zzTYtPPfXUqJ+u71Jtx6Y2WetV1KU8dWrNC6XrpOjaDKnrln5HQojXOkrl8DfVNXFSv2vqGGat\n5bHPPvtE/bRNr4t+HSs9vqnvS+p7kPUzIWSfh4t0rPOuSVGXsaj3uak1ZvT1dR0cf5/88ccfWzx6\n9OjM/U+dO1Ln6ay1YYpyHP3v2rx5c4v18/fXkqz1bHzf1D1QKdcn/zNaPvuRRx6x2Je67tatm8W6\n9lwIIcyZM8di/Z2rYY2jENLrF6W+p/pZ6z2/fw29p9Hrm//89G8D/3dN1j75MZvVz+9v3r91GzMd\nY+X4HfTv+osuuihq0/Gin53/e/HHP/6xxf5vkKzxXJfzaUOdN5mJAwAAAAAAUAA8xAEAAAAAACiA\niqRT6fT5EEqbqpl3uqKf7tS7d2+LtXS13yctC+3Ltuad/lXUqcSlyHsMFyxYYPG0adOitk6dOlms\n0+18aU2dOqfv5UvLacnj1DHTacr++7L66qtb7MuP61TVcePGZb5+Y1Zq+kXeNMK11lrL4uOOOy7q\np8fxnXfesdh/L1L7lHfKd+o1qrEk7tf09/bf3+eff95iHZchxKluOj1Yx0Nd6PlaUw9DCOGuu+6y\n+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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1a30d85a20>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "n = 10\n",
    "plt.figure(figsize=(20, 6))\n",
    "for i in range(n):\n",
    "    # display original\n",
    "    ax = plt.subplot(3, n, i+1)\n",
    "    plt.imshow(X_test[i].reshape(28, 28))\n",
    "    plt.gray()\n",
    "    ax.get_xaxis().set_visible(False)\n",
    "    ax.get_yaxis().set_visible(False)\n",
    "\n",
    "    \n",
    "    # display reconstruction\n",
    "    ax = plt.subplot(3, n, i+n+1)\n",
    "    plt.imshow(decoded_imgs[i].reshape(28, 28))\n",
    "    plt.gray()\n",
    "    ax.get_xaxis().set_visible(False)\n",
    "    ax.get_yaxis().set_visible(False)\n",
    "    \n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Plot the losses"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "dict_keys(['val_loss', 'loss'])\n"
     ]
    },
    {
     "data": {
      "image/png": "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\nQmCC\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x10c0cf3c8>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "print(history.history.keys())\n",
    "\n",
    "plt.plot(history.history['loss'])\n",
    "plt.plot(history.history['val_loss'])\n",
    "plt.title('model loss')\n",
    "plt.ylabel('loss')\n",
    "plt.xlabel('epoch')\n",
    "plt.legend(['train', 'validation'], loc='upper right')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "---"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# **Multilayer autoencoder**"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Create the network"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We extend the idea of the first network to more layers"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 68,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "input_size = 784\n",
    "hidden_size = 128\n",
    "code_size = 64\n",
    "\n",
    "x = Input(shape=(input_size,))\n",
    "hidden_1 = Dense(hidden_size, activation='relu')(x)\n",
    "h = Dense(code_size, activation='relu')(hidden_1)\n",
    "hidden_2 = Dense(hidden_size, activation='relu')(h)\n",
    "r = Dense(input_size, activation='sigmoid')(hidden_2)\n",
    "\n",
    "autoencoder = Model(inputs=x, outputs=r)\n",
    "autoencoder.compile(optimizer='adam', loss='mse')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 69,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/svg+xml": [
       "<svg height=\"337pt\" viewBox=\"0.00 0.00 142.85 337.00\" width=\"143pt\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n",
       "<g class=\"graph\" id=\"graph0\" transform=\"scale(1 1) rotate(0) translate(4 333)\">\n",
       "<title>G</title>\n",
       "<polygon fill=\"white\" points=\"-4,4 -4,-333 138.85,-333 138.85,4 -4,4\" stroke=\"none\"/>\n",
       "<!-- 112200354616 -->\n",
       "<g class=\"node\" id=\"node1\"><title>112200354616</title>\n",
       "<polygon fill=\"none\" points=\"0,-292.5 0,-328.5 134.85,-328.5 134.85,-292.5 0,-292.5\" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"67.4248\" y=\"-306.3\">input_11: InputLayer</text>\n",
       "</g>\n",
       "<!-- 112299069168 -->\n",
       "<g class=\"node\" id=\"node2\"><title>112299069168</title>\n",
       "<polygon fill=\"none\" points=\"11.7988,-219.5 11.7988,-255.5 123.051,-255.5 123.051,-219.5 11.7988,-219.5\" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"67.4248\" y=\"-233.3\">dense_13: Dense</text>\n",
       "</g>\n",
       "<!-- 112200354616&#45;&gt;112299069168 -->\n",
       "<g class=\"edge\" id=\"edge1\"><title>112200354616-&gt;112299069168</title>\n",
       "<path d=\"M67.4248,-292.313C67.4248,-284.289 67.4248,-274.547 67.4248,-265.569\" fill=\"none\" stroke=\"black\"/>\n",
       "<polygon fill=\"black\" points=\"70.9249,-265.529 67.4248,-255.529 63.9249,-265.529 70.9249,-265.529\" stroke=\"black\"/>\n",
       "</g>\n",
       "<!-- 112299098576 -->\n",
       "<g class=\"node\" id=\"node3\"><title>112299098576</title>\n",
       "<polygon fill=\"none\" points=\"11.7988,-146.5 11.7988,-182.5 123.051,-182.5 123.051,-146.5 11.7988,-146.5\" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"67.4248\" y=\"-160.3\">dense_14: Dense</text>\n",
       "</g>\n",
       "<!-- 112299069168&#45;&gt;112299098576 -->\n",
       "<g class=\"edge\" id=\"edge2\"><title>112299069168-&gt;112299098576</title>\n",
       "<path d=\"M67.4248,-219.313C67.4248,-211.289 67.4248,-201.547 67.4248,-192.569\" fill=\"none\" stroke=\"black\"/>\n",
       "<polygon fill=\"black\" points=\"70.9249,-192.529 67.4248,-182.529 63.9249,-192.529 70.9249,-192.529\" stroke=\"black\"/>\n",
       "</g>\n",
       "<!-- 112299100648 -->\n",
       "<g class=\"node\" id=\"node4\"><title>112299100648</title>\n",
       "<polygon fill=\"none\" points=\"11.7988,-73.5 11.7988,-109.5 123.051,-109.5 123.051,-73.5 11.7988,-73.5\" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"67.4248\" y=\"-87.3\">dense_15: Dense</text>\n",
       "</g>\n",
       "<!-- 112299098576&#45;&gt;112299100648 -->\n",
       "<g class=\"edge\" id=\"edge3\"><title>112299098576-&gt;112299100648</title>\n",
       "<path d=\"M67.4248,-146.313C67.4248,-138.289 67.4248,-128.547 67.4248,-119.569\" fill=\"none\" stroke=\"black\"/>\n",
       "<polygon fill=\"black\" points=\"70.9249,-119.529 67.4248,-109.529 63.9249,-119.529 70.9249,-119.529\" stroke=\"black\"/>\n",
       "</g>\n",
       "<!-- 112300184520 -->\n",
       "<g class=\"node\" id=\"node5\"><title>112300184520</title>\n",
       "<polygon fill=\"none\" points=\"11.7988,-0.5 11.7988,-36.5 123.051,-36.5 123.051,-0.5 11.7988,-0.5\" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"67.4248\" y=\"-14.3\">dense_16: Dense</text>\n",
       "</g>\n",
       "<!-- 112299100648&#45;&gt;112300184520 -->\n",
       "<g class=\"edge\" id=\"edge4\"><title>112299100648-&gt;112300184520</title>\n",
       "<path d=\"M67.4248,-73.3129C67.4248,-65.2895 67.4248,-55.5475 67.4248,-46.5691\" fill=\"none\" stroke=\"black\"/>\n",
       "<polygon fill=\"black\" points=\"70.9249,-46.5288 67.4248,-36.5288 63.9249,-46.5289 70.9249,-46.5288\" stroke=\"black\"/>\n",
       "</g>\n",
       "</g>\n",
       "</svg>"
      ],
      "text/plain": [
       "<IPython.core.display.SVG object>"
      ]
     },
     "execution_count": 69,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from IPython.display import SVG\n",
    "from keras.utils.vis_utils import model_to_dot\n",
    "\n",
    "SVG(model_to_dot(autoencoder).create(prog='dot', format='svg'))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Train the network"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 74,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train on 60000 samples, validate on 10000 samples\n",
      "Epoch 1/5\n",
      "60000/60000 [==============================] - 4s - loss: 0.0404 - val_loss: 0.0196\n",
      "Epoch 2/5\n",
      "60000/60000 [==============================] - 3s - loss: 0.0159 - val_loss: 0.0129\n",
      "Epoch 3/5\n",
      "60000/60000 [==============================] - 3s - loss: 0.0120 - val_loss: 0.0106\n",
      "Epoch 4/5\n",
      "60000/60000 [==============================] - 3s - loss: 0.0102 - val_loss: 0.0092\n",
      "Epoch 5/5\n",
      "60000/60000 [==============================] - 3s - loss: 0.0090 - val_loss: 0.0082\n"
     ]
    }
   ],
   "source": [
    "epochs = 5\n",
    "batch_size = 128\n",
    "\n",
    "history = autoencoder.fit(X_train, X_train, batch_size=batch_size, epochs=epochs, verbose=1, validation_data=(X_test, X_test))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Predict on the test set"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 75,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "decoded_imgs = autoencoder.predict(X_test)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Plot"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 76,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAABHEAAADnCAYAAACZmMoMAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3Xe8FNX5x/FDrKiIgCAWmmBviIhYMIJEEAUrSjSJJagx\nGmMUS2JiL79gC2Lvil1BbIixK9iCCkg1gIAIIgiiIMZ2f3/48vF7Hu8Me5fdvXd2P++/nvGcuzvs\nzJmdHc9znnpVVVUBAAAAAAAAddsvansHAAAAAAAAsGI8xAEAAAAAAMgAHuIAAAAAAABkAA9xAAAA\nAAAAMoCHOAAAAAAAABnAQxwAAAAAAIAM4CEOAAAAAABABvAQBwAAAAAAIAN4iAMAAAAAAJABPMQB\nAAAAAADIgFVr0rlevXpVxdoRpKuqqqpXiNfhGNaqhVVVVU0L8UIcx9rDWCwLjMUywFgsC4zFMsBY\nLAuMxTLAWCwLOY1FZuIApTOrtncAQAiBsQjUFYxFoG5gLAJ1Q05jkYc4AAAAAAAAGcBDHAAAAAAA\ngAzgIQ4AAAAAAEAG8BAHAAAAAAAgA3iIAwAAAAAAkAE8xAEAAAAAAMgAHuIAAAAAAABkwKq1vQOo\nTAMGDLC4fv36Udv2229v8aGHHpr4GjfccIPFr7/+etQ2ZMiQld1FAAAAAADqFGbiAAAAAAAAZAAP\ncQAAAAAAADKAhzgAAAAAAAAZwJo4KJkHH3zQ4rS1btT333+f2HbCCSdY3L1796jt5Zdftnj27Nm5\n7iJq2eabbx5tT5kyxeI///nPFg8ePLhk+1TJ1l57bYsvv/xyi3XshRDC22+/bXHfvn2jtlmzZhVp\n7wAAAGpHo0aNLG7ZsmVOf+Pvif7yl79YPGHCBIvff//9qN+4cePy2UWUMWbiAAAAAAAAZAAPcQAA\nAAAAADKAdCoUjaZPhZB7CpWm0DzzzDMWb7rpplG/3r17W9y2bduo7cgjj7T4sssuy+l9Uft23HHH\naFvT6ebMmVPq3al4G264ocXHHXecxT7NcaeddrJ4//33j9quu+66Iu0dVIcOHSweNmxY1Na6deui\nve8+++wTbU+ePNniDz/8sGjvixXT78gQQnj88cctPvnkky2+8cYbo37fffddcXesDDVr1szihx56\nyOLXXnst6nfzzTdbPHPmzKLv148aNmwYbe+5554Wjxw50uJvvvmmZPsEZMF+++1ncZ8+faK2vfba\ny+J27drl9Ho+TapVq1YWr7HGGol/t8oqq+T0+qgczMQBAAAAAADIAB7iAAAAAAAAZADpVCiojh07\nWnzQQQcl9ps4caLFfnriwoULLV66dKnFq6++etTvjTfesHiHHXaI2po0aZLjHqMuad++fbS9bNky\nix999NFS707Fadq0abR911131dKeoKZ69OhhcdqU7ELzKTvHHnusxf369SvZfuAH+t13/fXXJ/a7\n9tprLb799tujtuXLlxd+x8qMVqUJIb6n0dSl+fPnR/1qK4VKKwiGEF/rNR122rRpxd+xjFl33XWj\nbU3R33bbbS32VVJJTavbdBmGk046yWJNHQ8hhPr161tcr169lX5fX4UVyBczcQAAAAAAADKAhzgA\nAAAAAAAZwEMcAAAAAACADKjVNXF8yWnNQ5w7d27U9tVXX1l87733Wvzxxx9H/cjnrV1aktjnjmrO\nuK7fMG/evJxe+/TTT4+2t95668S+Tz31VE6vidqnOeVa9jaEEIYMGVLq3ak4p5xyisUHHnhg1Nap\nU6cav56Wrg0hhF/84qf/VzBu3DiLX3nllRq/NmKrrvrTV3ivXr1qZR/8WhunnXaaxWuvvXbUpmtc\noTh0/G2yySaJ/e6//36L9f4KydZff32LH3zwwaitcePGFutaRH/605+Kv2MJ/v73v1vcpk2bqO2E\nE06wmPvmnzvyyCMtvuSSS6K2Fi1aVPs3fu2cTz/9tPA7hoLR6+Of//znor7XlClTLNbfQigcLfGu\n1+oQ4jVatSx8CCF8//33Ft94440Wjx49OupXF6+TzMQBAAAAAADIAB7iAAAAAAAAZECtplMNHDgw\n2m7dunVOf6fTQL/44ouorZTT1ObMmWOx/7eMGTOmZPtRlzzxxBMW69S2EOJjtWjRohq/ti9Xu9pq\nq9X4NVD3bLnllhb79As/ZR2Fd/XVV1us00rzdfDBByduz5o1y+LDDz886ufTcrBiXbt2tXjXXXe1\n2H8fFZMvtaxprmuttVbURjpV4fly8uecc05Of6epqlVVVQXdp3LVoUMHi/2UfHXhhReWYG9+bptt\ntom2NQX90Ucfjdr4bv05Ta/517/+ZXGTJk2ifknjZfDgwdG2pofnc8+L3PjUGU2N0pSYkSNHRv3+\n97//WbxkyRKL/feU3pf++9//jtomTJhg8Ztvvmnxu+++G/Vbvnx54usjd7r8QgjxGNN7TX9O5GqX\n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\nABnw/4S3ONpulhhuAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1a26169da0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "n = 10\n",
    "plt.figure(figsize=(20, 6))\n",
    "for i in range(n):\n",
    "    # display original\n",
    "    ax = plt.subplot(3, n, i+1)\n",
    "    plt.imshow(X_test[i].reshape(28, 28))\n",
    "    plt.gray()\n",
    "    ax.get_xaxis().set_visible(False)\n",
    "    ax.get_yaxis().set_visible(False)\n",
    "\n",
    "    \n",
    "    # display reconstruction\n",
    "    ax = plt.subplot(3, n, i+n+1)\n",
    "    plt.imshow(decoded_imgs[i].reshape(28, 28))\n",
    "    plt.gray()\n",
    "    ax.get_xaxis().set_visible(False)\n",
    "    ax.get_yaxis().set_visible(False)\n",
    "    \n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Plot the losses"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 77,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "dict_keys(['val_loss', 'loss'])\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAZIAAAEWCAYAAABMoxE0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3Xl4VeW5///3nZlMZCQJBAyjzLOIUhEZFNFKa51qHc+x\n1Fk8/faU9nc6ndN+v149PQ60autAj7ZWy9HaUoeDgKhYRRlEJIxhkkBmIAMhIcP9+2OthE3IsEOy\ns3aS+3Vd+8peez1r73svEz4+z3rWWqKqGGOMMecqxOsCjDHGdG8WJMYYYzrEgsQYY0yHWJAYY4zp\nEAsSY4wxHWJBYowxpkMsSIwJIBH5bxH5uZ9tD4jI3I6+jzFdzYLEGGNMh1iQGGOM6RALEtPruUNK\n3xORrSJyQkSeF5E0EXlbRMpFZLWIJPq0v0ZEskXkuIi8JyKjfNZNEpHN7nZ/BqKafNbVIrLF3fYj\nERl/jjV/W0RyROSoiKwQkf7u6yIij4lIoYiUicgXIjLWXbdARLa7tR0Wkf9zTjvMmCYsSIxxfAOY\nB4wAvgq8DfwQSMX5O3kQQERGAC8Di911bwF/F5EIEYkA/gr8AUgC/sd9X9xtJwHLgO8AycDvgBUi\nEtmeQkVkNvD/gBuADOAg8Iq7+nJgpvs9+rptStx1zwPfUdU4YCzwbns+15iWWJAY4/i1qhao6mFg\nHfCJqn6mqlXA68Akt92NwJuqukpVa4BfAX2Ai4HpQDjwuKrWqOqrwAafz1gE/E5VP1HVOlV9Aah2\nt2uPbwHLVHWzqlYDPwAuEpEsoAaIA0YCoqo7VDXP3a4GGC0i8ap6TFU3t/NzjWmWBYkxjgKf5yeb\nWY51n/fH6QEAoKr1wCFggLvusJ55JdSDPs/PA77rDmsdF5HjwEB3u/ZoWkMFTq9jgKq+C/wGeBIo\nFJFnRCTebfoNYAFwUETeF5GL2vm5xjTLgsSY9jmCEwiAc0wCJwwOA3nAAPe1BoN8nh8CfqGqCT6P\naFV9uYM1xOAMlR0GUNWlqjoFGI0zxPU99/UNqroQ6IczBLe8nZ9rTLMsSIxpn+XAVSIyR0TCge/i\nDE99BHwM1AIPiki4iFwLTPPZ9lngbhG50D0oHiMiV4lIXDtreBm4U0QmusdX/i/OUNwBEbnAff9w\n4ARQBdS7x3C+JSJ93SG5MqC+A/vBmEYWJMa0g6ruAm4Bfg0U4xyY/6qqnlLVU8C1wB3AUZzjKX/x\n2XYj8G2coadjQI7btr01rAZ+BLyG0wsaCtzkro7HCaxjOMNfJcB/uutuBQ6ISBlwN86xFmM6TOzG\nVsYYYzrCeiTGGGM6xILEGGNMh1iQGGOM6RALEmOMMR0S5nUBXSElJUWzsrK8LsMYY7qVTZs2Fatq\nalvtekWQZGVlsXHjRq/LMMaYbkVEDrbdyoa2jDHGdJAFiTHGmA6xIDHGGNMhveIYiTGm56ipqSE3\nN5eqqiqvS+kxoqKiyMzMJDw8/Jy2tyAxxnQrubm5xMXFkZWVxZkXWjbnQlUpKSkhNzeXwYMHn9N7\n2NCWMaZbqaqqIjk52UKkk4gIycnJHerhWZAYY7odC5HO1dH9aUHSio/2FvPUezlel2GMMUEtoEEi\nIvNFZJeI5IjIkmbWi4gsdddvFZHJTdaHishnIvKGz2tJIrJKRPa4PxMDVf/anYX8auUu9hZVBOoj\njDHd0PHjx3nqqafavd2CBQs4fvx4ACryVsCCRERCce4bfSXOLT+/KSKjmzS7EhjuPhYBTzdZ/xCw\no8lrS4A1qjocWOMuB8R3Lh1KZFgoS9fsCdRHGGO6oZaCpLa2ttXt3nrrLRISEgJVlmcC2SOZBuSo\n6j73znGvAAubtFkIvKiO9UCCiGQAiEgmcBXwXDPbvOA+fwH4WqC+QEpsJLddfB4rPj/CnoLyQH2M\nMaabWbJkCXv37mXixIlccMEFXHLJJVxzzTWMHu38v/LXvvY1pkyZwpgxY3jmmWcat8vKyqK4uJgD\nBw4watQovv3tbzNmzBguv/xyTp486dXX6bBATv8dABzyWc4FLvSjzQCc24c+Dvwr0PR+1mmqmuc+\nzwfSmvtwEVmE08th0KBB51C+4zszh/LHjw/yxJo9/ObmyW1vYIzpMj/7ezbbj5R16nuO7h/PT746\nptU2jzzyCNu2bWPLli289957XHXVVWzbtq1x+uyyZctISkri5MmTXHDBBXzjG98gOTn5jPfYs2cP\nL7/8Ms8++yw33HADr732GrfcckunfpeuEpQH20XkaqBQVTe11k6d+wQ3e69gVX1GVaeq6tTU1DYv\nXtmipJgIbr84ize/yGNXvvVKjDFnmzZt2hnnYCxdupQJEyYwffp0Dh06xJ49Zw+PDx48mIkTJwIw\nZcoUDhw40FXldrpA9kgOAwN9ljPd1/xp8w3gGhFZAEQB8SLyR1W9BSgQkQxVzXOHwQoD9g1c375k\nCC9+fJAn1uzmqW9NCfTHGWP81FbPoavExMQ0Pn/vvfdYvXo1H3/8MdHR0cyaNavZczQiIyMbn4eG\nhnbroa1A9kg2AMNFZLCIRAA3ASuatFkB3ObO3poOlKpqnqr+QFUzVTXL3e5dN0QatrndfX478LcA\nfgcAEmMiuHNGFm99kd/p3WhjTPcTFxdHeXnzIxSlpaUkJiYSHR3Nzp07Wb9+fRdX1/UCFiSqWgvc\nD6zEmXm1XFWzReRuEbnbbfYWsA/IAZ4F7vXjrR8B5onIHmCuuxxwd31lCHGRYTyxZndXfJwxJogl\nJyczY8YMxo4dy/e+970z1s2fP5/a2lpGjRrFkiVLmD59ukdVdh1xDjP0bFOnTtXOuLHVY6t288Sa\nPbzxwFcYO6BvJ1RmjGmvHTt2MGrUKK/L6HGa268isklVp7a1bVAebA9W//SVwcRHhfH4ajuvxBhj\nGliQtEPfPuHcdckQVu8oYGtuzzs71RhjzoUFSTvdOSOLvn3CrVdijDEuC5J2iosKZ9HMIby7s5DP\nvjzmdTnGGOM5C5JzcPvFWSRGW6/EGGPAguScxEaGsWjmUN7fXcSmg9YrMcb0bhYk5+i2i84jOSaC\nx1fbeSXGmNbFxsYCcOTIEa677rpm28yaNYu2TlN4/PHHqaysbFwOlsvSW5Cco5jIMO6+dCjr9hSz\n4cBRr8sxxnQD/fv359VXXz3n7ZsGSbBclt6CpANumX4eKbGRPLbKeiXG9CZLlizhySefbFz+6U9/\nys9//nPmzJnD5MmTGTduHH/729lXbzpw4ABjx44F4OTJk9x0002MGjWKr3/962dca+uee+5h6tSp\njBkzhp/85CeAcyHII0eOcNlll3HZZZcBpy9LD/Doo48yduxYxo4dy+OPP974eV1xufpAXrSxx+sT\nEco9s4byH29s5+O9JVw0NLntjYwxneftJZD/Ree+Z/o4uLL1Ky/deOONLF68mPvuuw+A5cuXs3Ll\nSh588EHi4+MpLi5m+vTpXHPNNS3eD/3pp58mOjqaHTt2sHXrViZPPn2bil/84hckJSVRV1fHnDlz\n2Lp1Kw8++CCPPvooa9euJSUl5Yz32rRpE7///e/55JNPUFUuvPBCLr30UhITE7vkcvXWI+mgb104\niH5xkTy2eje94XIzxhiYNGkShYWFHDlyhM8//5zExETS09P54Q9/yPjx45k7dy6HDx+moKCgxff4\n4IMPGv9BHz9+POPHj29ct3z5ciZPnsykSZPIzs5m+/btrdbz4Ycf8vWvf52YmBhiY2O59tprWbdu\nHdA1l6u3HkkHRYWHcu+sofz0706v5OJhKW1vZIzpHG30HALp+uuv59VXXyU/P58bb7yRl156iaKi\nIjZt2kR4eDhZWVnNXj6+Lfv37+dXv/oVGzZsIDExkTvuuOOc3qdBV1yu3nokneCmaYNIj4/i0VXW\nKzGmt7jxxht55ZVXePXVV7n++uspLS2lX79+hIeHs3btWg4ePNjq9jNnzuRPf/oTANu2bWPr1q0A\nlJWVERMTQ9++fSkoKODtt99u3Kaly9dfcskl/PWvf6WyspITJ07w+uuvc8kll3Tit22dBUkniAoP\n5b7LhrLx4DE+zCn2uhxjTBcYM2YM5eXlDBgwgIyMDL71rW+xceNGxo0bx4svvsjIkSNb3f6ee+6h\noqKCUaNG8eMf/5gpU5yb5k2YMIFJkyYxcuRIbr75ZmbMmNG4zaJFi5g/f37jwfYGkydP5o477mDa\ntGlceOGF3HXXXUyaNKnzv3QL7DLynaS6to7L/vM90vpG8Zd7Lm7xAJsxpmPsMvKBYZeRDwKRYaHc\nN3sYn315nPd3F3ldjjHGdBkLkk50/ZSBDEjow2N2rMQY04tYkHSiiLAQHpg9jM9zS1m7q9Drcozp\nsex/1DpXR/enBUkn+8aUTAYm9eGxVXvsl92YAIiKiqKkpMT+vjqJqlJSUkJUVNQ5v4edR9LJwkND\neGD2cP711a2s3lHIvNFpXpdkTI+SmZlJbm4uRUV2LLKzREVFkZmZec7bW5AEwLWTBvDk2hweW7Wb\nuaP62QwuYzpReHg4gwcP9roM4yOgQ1siMl9EdolIjogsaWa9iMhSd/1WEZnsvh4lIp+KyOciki0i\nP/PZ5qciclhEtriPBYH8DuciLDSEB2cPZ3teGSuzW75EgjHG9AQBCxIRCQWeBK4ERgPfFJHRTZpd\nCQx3H4uAp93Xq4HZqjoBmAjMF5HpPts9pqoT3cdbgfoOHbFwYn8Gp8Tw+Ord1NfbWK4xpucKZI9k\nGpCjqvtU9RTwCrCwSZuFwIvqWA8kiEiGu1zhtgl3H93qX+Ow0BAemjOcnfnl/G92vtflGGNMwAQy\nSAYAh3yWc93X/GojIqEisgUoBFap6ic+7R5wh8KWiUhi55feOb46oT9DU61XYozp2YJ2+q+q1qnq\nRCATmCYiY91VTwNDcIa88oD/am57EVkkIhtFZKNXsztCQ4SH5o5gd0EFb36R50kNxhgTaIEMksPA\nQJ/lTPe1drVR1ePAWmC+u1zghkw98CzOENpZVPUZVZ2qqlNTU1M79EU64qpxGQzvF8vjq3dTZ70S\nY0wPFMgg2QAMF5HBIhIB3ASsaNJmBXCbO3trOlCqqnkikioiCQAi0geYB+x0lzN8tv86sC2A36HD\nQkOExXNHsLfoBG9sPeJ1OcYY0+kCdh6JqtaKyP3ASiAUWKaq2SJyt7v+t8BbwAIgB6gE7nQ3zwBe\ncGd+hQDLVfUNd90vRWQizsH3A8B3AvUdOsuVY9MZmR7HE6v3cNW4DMJCg3ZE0Rhj2s0uI99F/ndb\nHnf/cTOP3jCBayef+xmkxhjTVewy8kHm8tHpjM6IZ+maPdTW1XtdjjHGdBoLki4SEiIsnjucAyWV\nvP5Z0zkHxhjTfVmQdKF5o9MYOyCepe/uocZ6JcaYHsKCpAuJCA/PHcGhoyf5y+Zcr8sxxphOYUHS\nxWaP7MeEzL4sXZPDqVrrlRhjuj8Lki4mIiyeN4LDx0/y6ibrlRhjuj8LEg/MGpHKpEEJ/ObdPVTX\n1nldjjHGdIgFiQcajpUcKa1i+YZDbW9gjDFBzILEI5cMT2HqeYk8uXYvVTXWKzHGdF8WJB4RER6e\nN4L8sipe+fRLr8sxxphzZkHioYuHJjNtcBJPvWe9EmNM92VB4qGGYyWF5dW89In1Sowx3ZMFiccu\nGprMRUOSefq9vZw8Zb0SY0z3Y0ESBB6eN4Liimr+uP6g16UYY0y7WZAEgWmDk/jKsBR++/5eKk/V\nel2OMca0iwVJkHh43nBKTpzixY+tV2KM6V4sSILElPOSmDkild+9v5eKauuVGGO6DwuSIPLw3OEc\nq6zhhY8OeF2KMcb4zYIkiEwalMhl56fy7Lp9lFfVeF2OMcb4xYIkyCyeO4LjlTX89z8OeF2KMcb4\nxYIkyEwYmMDcUf14dt0+yqxXYozpBixIgtDiuSMoq6pl2Yf7vS7FGGPaFNAgEZH5IrJLRHJEZEkz\n60VElrrrt4rIZPf1KBH5VEQ+F5FsEfmZzzZJIrJKRPa4PxMD+R28MHZAXy4fncbzH+6ntNJ6JcaY\n4BawIBGRUOBJ4EpgNPBNERndpNmVwHD3sQh42n29GpitqhOAicB8EZnurlsCrFHV4cAad7nHWTx3\nBOVVtTz/4T6vSzHGmFYFskcyDchR1X2qegp4BVjYpM1C4EV1rAcSRCTDXa5w24S7D/XZ5gX3+QvA\n1wL4HTwzun88V45NZ9k/DnC88pTX5RhjTIsCGSQDAN/b/+W6r/nVRkRCRWQLUAisUtVP3DZpqprn\nPs8H0pr7cBFZJCIbRWRjUVFRx76JRxbPHcGJU7U8u856JcaY4BW0B9tVtU5VJwKZwDQRGdtMG+V0\nT6XpumdUdaqqTk1NTQ1wtYFxfnocC8Zl8N//OMDRE9YrMcYEp0AGyWFgoM9ypvtau9qo6nFgLTDf\nfalARDIA3J+FnVhz0Fk8ZziVNXU884H1SowxwSmQQbIBGC4ig0UkArgJWNGkzQrgNnf21nSgVFXz\nRCRVRBIARKQPMA/Y6bPN7e7z24G/BfA7eG54WhxfHd+fFz8+QHFFtdflGGPMWQIWJKpaC9wPrAR2\nAMtVNVtE7haRu91mbwH7gBzgWeBe9/UMYK2IbMUJpFWq+oa77hFgnojsAea6yz3ag3OGU2W9EmNM\nkBLnMEPPNnXqVN24caPXZXTIw3/ewtvb8lj3r7NJjYv0uhxjTC8gIptUdWpb7YL2YLs504NzhlNT\np/z2/b1el2KMMWewIOkmBqfE8LWJA/jj+oMUllV5XY4xxjSyIOlGHpwzjNp65an3rFdijAkeFiTd\nyHnJMXxj8gD+9OmX5Jdar8QYExwsSLqZB2YPp75eeeq9HK9LMcYYwIKk2xmYFM31UzN55dNDHDl+\n0utyjDHGgqQ7uu+yYSjKk2utV2KM8Z4FSTeUmRjNDVMHsnzjIXKPVXpdjjGml7Mg6abuu2wYgliv\nxBjjOQuSbqp/Qh9umjaQ/9mYy6Gj1isxxnjHgqQbu3fWMEJChF+/u8frUowxvZgFSTeW3jeKm6cN\n4rXNhzlQfMLrcowxvZQFSTd376yhhIUIv37XjpUYY7xhQdLN9YuP4tbp5/H6Z7nsK6poewNjjOlk\nFiQ9wHcuHUpEWIj1SowxnrAg6QFS4yK5/aIs/rblMDmF1isxxnQtC5IeYtHMIUSFh7J0jc3gMsZ0\nLQuSHiI5NpLbL87i71uPsLug3OtyjDG9iAVJD7LokiFEh4fyhPVKjDFdyIKkB0mMieDOGYN5c2se\nO/PLvC7HGNNLWJD0MHddMpi4yDCeWG29EmNM17Ag6WESoiO48yuDeXtbPtlHSr0uxxjTCwQ0SERk\nvojsEpEcEVnSzHoRkaXu+q0iMtl9faCIrBWR7SKSLSIP+WzzUxE5LCJb3MeCQH6H7uifvzKYuCjr\nlRhjuoZfQSIiD4lIvPsP//MisllELm9jm1DgSeBKYDTwTREZ3aTZlcBw97EIeNp9vRb4rqqOBqYD\n9zXZ9jFVneg+3vLnO/QmffuEc9dXhvDO9gK2HbZeiTEmsPztkfyTqpYBlwOJwK3AI21sMw3IUdV9\nqnoKeAVY2KTNQuBFdawHEkQkQ1XzVHUzgKqWAzuAAX7WaoA7v5JFfFQYj6/e7XUpxpgezt8gEffn\nAuAPqprt81pLBgCHfJZzOTsM2mwjIlnAJOATn5cfcIfClolIYrMFiywSkY0isrGoqKiNUnue+Khw\nFs0cwuodhXx+6LjX5RhjejB/g2STiLyDEyQrRSQOqA9cWQ4RiQVeAxa7PSJwhr+GABOBPOC/mttW\nVZ9R1amqOjU1NTXQpQal2y/OIiE63HolxpiA8jdI/hlYAlygqpVAOHBnG9scBgb6LGe6r/nVRkTC\ncULkJVX9S0MDVS1Q1TpVrQeexRlCM82Ic3sla3cVsfnLY16XY4zpofwNkouAXap6XERuAf4NaOso\n7gZguIgMFpEI4CZgRZM2K4Db3IP404FSVc0TEQGeB3ao6qO+G4hIhs/i14Ftfn6HXun2i7JIiong\nsVXWKzHGBIa/QfI0UCkiE4DvAnuBF1vbQFVrgfuBlTgHy5eraraI3C0id7vN3gL2ATk4vYt73ddn\n4BzQn93MNN9fisgXIrIVuAx42M/v0CvFRIbxnZlDWLenmI0HjnpdjjGmBxJVbbuRyGZVnSwiPwYO\nq+rzDa8FvsSOmzp1qm7cuNHrMjxTeaqWmb9cy/npcbx013SvyzHGdBMisklVp7bVzt8eSbmI/ACn\nl/CmiITgHCcx3UB0RBh3XzqUf+SU8Mm+Eq/LMcb0MP4GyY1ANc75JPk4B8X/M2BVmU73rQvPIyU2\nksdsBpcxppP5FSRueLwE9BWRq4EqVW31GIkJLn0iQrl31lDW7zvKR3uLvS7HGNOD+HuJlBuAT4Hr\ngRuAT0TkukAWZjrfzRcOol9cJI+v2oM/x8aMMcYf/g5t/X8455Dcrqq34Zy78aPAlWUCISo8lPsu\nG8anB47y0V47VmKM6Rz+BkmIqhb6LJe0Y1sTRG68YCAZfaN4dNVu65UYYzqFv2HwvyKyUkTuEJE7\ngDdxzgEx3UxUeCj3XjaMTQePsW6PHSsxxnScvwfbvwc8A4x3H8+o6vcDWZgJnBumZjIgoY/1Sowx\nncLv4SlVfU1V/8V9vB7IokxgRYY5x0q2HDrOe7t735WRjTGdq9UgEZFyESlr5lEuImWtbWuC23VT\nMslM7MNj1isxxnRQq0GiqnGqGt/MI05V47uqSNP5IsJCeGD2MLbmlvLuzsK2NzDGmBbYzKte7NrJ\nmQxKiuax1dYrMcacOwuSXiw81OmVbDtcxqrtBV6XY4zppixIermvTxpAVnI0j63eQ3299UqMMe1n\nQdLLhYWG8OCc4ezIK+Od7flel2OM6YYsSAzXTOjPkNQYHltlvRJjTPtZkBjCQkN4aM5wdhWU8/Y2\n65UYY9rHgsQAcPX4/gzrF8vjq3dTZ70SY0w7WJAYAEJDhIfmDGdPYQVvfpHndTnGmG7EgsQ0umpc\nBiPSYnnCeiXGmHawIDGNQkKExXNHsLfoBH///IjX5RhjugkLEnOG+WPSGZkexxNr9lBbV+91OcaY\nbiCgQSIi80Vkl4jkiMiSZtaLiCx1128Vkcnu6wNFZK2IbBeRbBF5yGebJBFZJSJ73J+JgfwOvU1D\nr2R/8Qn+tsV6JcaYtgUsSEQkFHgSuBIYDXxTREY3aXYlMNx9LAKedl+vBb6rqqOB6cB9PtsuAdao\n6nBgjbtsOtEVY9IY0z+epe/uocZ6JcaYNgSyRzINyFHVfap6CngFWNikzULgRXWsBxJEJENV81R1\nM4CqlgM7gAE+27zgPn8B+FoAv0OvJOL0Sg6WVPL65sNel2OMCXKBDJIBwCGf5VxOh4HfbUQkC5gE\nfOK+lKaqDfNT84G05j5cRBaJyEYR2VhUZDdvaq+5o/oxbkBf65UYY9oU1AfbRSQWeA1YrKpn3UhL\nnWufNztPVVWfUdWpqjo1NTX13Aoo2A77153btt2ciPAv80aQe+wkr27K9bocY0wQC2SQHAYG+ixn\nuq/51UZEwnFC5CVV/YtPmwIRyXDbZACBuyvTh4/BC1fDH66FvM8D9jHBatb5qUwcmMBv3s3hVK31\nSowxzQtkkGwAhovIYBGJAG4CVjRpswK4zZ29NR0oVdU8ERHgeWCHqj7azDa3u89vB/4WsG9wzVKY\n9x9weBP8bia8+k9QsjdgHxdsRISH543g8PGTLN94qO0NjDG9UsCCRFVrgfuBlTgHy5eraraI3C0i\nd7vN3gL2ATnAs8C97uszgFuB2SKyxX0scNc9AswTkT3AXHc5MML7wIwH4aHP4ZLvws634Mlp8Ma/\nQHnvuBHUzOEpTB6UwJNrc6iurfO6HGNMEJLecIvVqVOn6saNGzv+RuX58P4vYfMLEBoB0+91giaq\nb8ffO4h9uKeYW57/hH9fOIbbLsryuhxjTBcRkU2qOrWtdkF9sD3oxKXD1Y/CfZ/C+VfCul/BExPg\no19DTZXX1QXMjGHJXJCVyJNrc6iqsV6JMeZMFiTnInkoXLcMFr0P/SfDO/8Gv54Mm/8AdbVeV9fp\nGo6VFJRV8/KnX3pdjjEmyFiQdET/iXDrX+D2vzu9lRX3w9MXw46/Qw8bMrx4aAoXDk7iqff2Wq/E\nGHMGC5LOMHgm3LUGbvwjoPDnW+C5uT3uHJSH542gqLyaP64/6HUpxpggYkHSWURg1Ffhno/hmt9A\neV6POwdl+pBkLh6azG/f30vlqZ43hGeMOTcWJJ0tNAwm3woPbOqR56A8PG8ExRWnrFdijGlkQRIo\nTc9B2fV2jzgH5YKsJC4ZnsLv3t/HiWrrlRhjLEgCr08CzPkxPPgZTL7dOQdl6URY8+9QVep1dedk\n8dwRlJw4xYsfW6/EGGNB0nXOOgflv5xzUP6xFGpOel1du0w5L5FLR6TyzAd7qbBeiTG9ngVJV2s4\nB+U7HzjnoKz6Efx6Cmx+sVudg/LwvBEcq6zhhY8OeF2KMcZjFiReyZjgcw5KBqx4AJ6+CLav6Bbn\noEwcmMDskf145oN9lFfVeF2OMcZDFiReGzwT7lrtnoMCLL8VnpsD+z/wti4/PDx3BKUna/j9Pw54\nXYoxxkMWJMHgrHNQ8uGFrwb9OSjjMvsyd1Qaz63bR+lJ65UY01tZkASTxnNQNsPlP4cjm4P+HJTF\nc4dTVlXLsg/3e12KMcYjFiTBKDwKLn7APQfl/zQ5ByXf6+rOMHZAX64Yk8ayD/dTWmm9EmN6IwuS\nYBbVF+b8yDkHZcod7jkok4LuHJTFc0dQXl3Lcx/u87oUY4wHLEi6g7h0uOq/3HNQFgTdOSijMuJZ\nMC6d3//jAMdOnPK6HGNMF7Mg6U6Sh8J1zzvnoAyYElTnoDw0ZwQnTtXy7DrrlRjT21iQdEcZE+CW\n1+D2N4LmHJTz0+O4enx/nn5/L9f/9iOeW7ePQ0crPanFGNO17J7t3Z0q7HzTOW5SvMvpqcz9qXN+\nShcrPVnDsg/38872AnbklQEwMj2OK8akc8WYdEZlxCEiXV6XMebc+HvPdguSnqKuFra+Amv/H5Tl\nwtA5zsWXG65lAAAVAUlEQVQi+0/0pJwvSyp5Z3s+K7Pz2XjwGKowMKkPl492QmXKeYmEhlioGBPM\ngiJIRGQ+8AQQCjynqo80WS/u+gVAJXCHqm521y0DrgYKVXWszzY/Bb4NFLkv/VBV32qtjl4RJA1q\nqmDDc7DuV3DyGIy5Fmb/m3N8xSPFFdWs3l7Ayux8/pFTwqm6elJiI5g7Ko3Lx6Rx8dAUosJDPavP\nGNM8z4NEREKB3cA8IBfYAHxTVbf7tFkAPIATJBcCT6jqhe66mUAF8GIzQVKhqr/yt5ZeFSQNqkqd\nWV3rn4K6UzD5Nrj0+84MMA+VV9Xw/u4iVmYXsHZnIRXVtcREhDJrZD+uGJPOZeenEhcV7mmNxhiH\nv0ESFsAapgE5qrrPLegVYCGw3afNQpygUGC9iCSISIaq5qnqByKSFcD6eraGc1CmLYIPfgmb/hu2\nvAzT74EZDzn3SfFAXFQ4V4/vz9Xj+1NdW8dHe0t4J7uAVdsLeHNrHuGhwsVDU7hiTDrzRqeRGhfp\nSZ3GGP8FskdyHTBfVe9yl28FLlTV+33avAE8oqofustrgO+r6kZ3OQt4o5keyZ1AKbAR+K6qHmvm\n8xcBiwAGDRo05eDBXn4TpqP74N1fwLZXISrBuWvjtG87d3IMAnX1ymdfHmNldj4rswv48mglIjB5\nUCJXjEnjijHpnJcc43WZxvQqwTC0FaggSQOKAQX+A8hQ1X9qrZZeObTVkrytsOZnkLMa4gfArCUw\n4WbnOl9BQlXZVVDOym0FvLM9n+wjzgyw89PiuGJMGpePSWdM/3ibAWZMgAXD0NZhYKDPcqb7Wnvb\nnEFVG294LiLPAm90rMxeJmO8cw7K/nWw+qfOOSgf/Rpm/8i5AnEQ/OMsIoxMj2dkejwPzR3OoaOV\nvOMerP/N2hyWvptDZqIzA+zyMWlckJVkM8CM8VAgeyRhOAfb5+CEwwbgZlXN9mlzFXA/pw+2L1XV\naT7rszi7R5Khqnnu84dxejk3tVaL9UhaEETnoPirpKKaNTsKWZmdz7qcYk7V1pMUE8HcUc7B+hnD\nbAaYMZ3F86Ett4gFwOM403+XqeovRORuAFX9rTv99zfAfJzpv3f6DGu9DMwCUoAC4Ceq+ryI/AGY\niDO0dQD4TkOwtMSCpA31dfD5yz7noMyGOT/x7BwUf1VU1/L+riLe2Z7PuzsKKa+uJToilFnnpzoz\nwEb2I95mgBlzzoIiSIKFBYmfgvAcFH+dqq3n430lrMzOZ9X2AorKqwkPFaYPSeaKMelcPjqNfvFR\nXpdpTLdiQeLDgqSdqkqd4yYfPxlU56D4q75e+ezQcd7Jds6sP1DizACbNDCBy93LtQxOsRlgxrTF\ngsSHBck5Ki+AD/4TNv0eQsI9PwflXKgqeworWLktn5Xb89l22JkBNiIttvEaYDYDzJjmWZD4sCDp\noKP7YO3/hS/+JyjPQWmPw8dPNvZUPt1/lHqFAQl9mDfaOVflgqxEwkLtotjGgAXJGSxIOkneVmeG\nV86qoD0HpT2OnjjFmh0FrMwuYN2eIqpr60mMDmfOKCdULhluM8BM72ZB4sOCpJMd+NA5ByV3AyQP\ndy7FMuqaoDgH5VxVnmqYAVbAmh0FlFU5M8AuHZHK5WPSmD0yjb59bAaY6V0sSHxYkARA03NQ+k92\nzkEZcqnXlXVYTV09690ZYO9kF1BYXk1YiHDR0GQud2eApdkMMNMLWJD4sCAJoPo6+PwV5xhKWS4M\nnA6Dpjtn0KePh6QhENJ9h4fq65XPc4+zMruAd7Lz2Vd8AoCJAxPcg/VpDEmN9bhKYwLDgsSHBUkX\naDgHZesrULgT6muc18NjIG0MpI9zHhnjod/obnmgXlXZW1TBymznci1bc0sBGNYvtvHCkuMG9LUZ\nYKbHsCDxYUHSxWpPQdFOyP8C8re6P7+AamfqLRIKKSPODJf08RCd5G3d7XTk+ElWudcA+2T/Uerq\nlYy+UVzuzgCbNjjJZoCZbs2CxIcFSRBQhWMHTodKQ8CU+VyjMz6zSbiMg4TzusVB/GMnTrFmZyHv\nZOfzwZ4iqmrqSYgOZ85I5y6QM4en0iei+w7xmd7JgsSHBUkQO1F8drgU7watd9ZH9j0dLg0Bk3I+\nhEV4W3crKk/V8sHuYt7JzmfNzkJKT9YQFR7CpSOca4DNHtmPhOjgrd+YBhYkPixIupmak1Cw3Q0W\nN1wKsqGm0lkfGgGpI53hsIZwSRsLUfHe1t2Mmrp6Pt1/tHEGWH5ZFaEhwvQhSY2hMiChjx1XMUHJ\ngsSHBUkPUF8HJXt9jrlsdU6QrCw+3SYxyw2X8aeHxuIygmZoTFXZmlvq3gUyn71FzgywmIhQBqfG\nMCQllsEpMQxxn2elRNv9642nLEh8WJD0UKpQnu8zLOaGzNF9p9tEJ5/uuTQETPKwoJiSnFNYwUd7\ni9lXdIL9xSfYV1xB7rGT+P5JpsZFMsQNl8EpbtikxjAoKZpwO5BvAsyCxIcFSS9TXQ75284MmMId\nzpWMAcL6NJmSPMGZkhwR7W3dQFVNHV8erTwdLkUV7C92npecONXYLjREGJQU7YZLDIPdoBmaGku/\nuEgbKjOdwoLEhwWJoa4GinY1ObC/1blkPoCEOD0V3+Mu6eMhJsXbun2UVtawr7jCDZiGXswJ9hdX\nUFVT39guOiLUHSKLbQyahh6NDZWZ9rAg8WFBYpqlCqWHnGMtvrPGSg+dbhOX4TM05gZMQhaEBM+w\nUn29kl9W1diD2ecTNLnHKqn3+RNPiY10j8E0hIsTNoOSookIC57vZIKDBYkPCxLTLpVHz56SXLQL\ntM5ZHxF39pTk1JEQFult3c2orq3jy5JKt+dy5lBZccWZQ2UDE/s005OJJS3ehsp6KwsSHxYkpsNq\nqqBwe5OA2QY1zswrQsKan5IcxDcBK62sYX+JMzS2r8gdJnN7Midr6hrbRUeEkpUc09iTaZxhlhpD\nvA2V9WgWJD4sSExA1NfDsf2Q9/mZvZeKgtNtEgadnpLcEDDxA4JmSnJz6uuVgvIq9hedYK8bLg3H\nZg4dbTpUFtE4bXmwz5DZoKQYGyrrASxIfFiQmC5VXtDkOmNbnXNgcP/W+iSdHhZLGwN9B0J8f+d4\nTBDMHGvNqdp6vjzqc7Df56B/cUV1Y7sQgYGNs8pizwiZtLgoQkKCN0jNaRYkPixIjOeqK5yz833D\npWA71FWf2a5PotNjie/vPpp5HhnnzXdoQ+nJGg74HItpOC6zv/gEladOD5X1CQ8lK8VnqMznuIzd\nPCy4BEWQiMh84AkgFHhOVR9psl7c9QuASuAOVd3srlsGXA0UqupYn22SgD8DWcAB4AZVPdZaHRYk\nJijV1ToXsiw7DGVHfH4egXL354mis7eLjD8dLnH9mw+dPolBM3ymqhSUVbPPPRaz3ydsDh07SZ3P\nWFlyTETjVOXBKbGNYTMoOZrIMO9PIu1tPA8SEQkFdgPzgFxgA/BNVd3u02YB8ABOkFwIPKGqF7rr\nZgIVwItNguSXwFFVfURElgCJqvr91mqxIDHdVm01lOedDphmQyefxmGzBmF9Wu/VxPeH6BTPpzE7\nQ2WVbrj4HPQvPkFR+ZlDZZmJ0WSlxJAWF0mq7yP29PPYyDCbYdaJ/A2SsADWMA3IUdV9bkGvAAuB\n7T5tFuIEhQLrRSRBRDJUNU9VPxCRrGbedyEwy33+AvAe0GqQGNNthUU61xBLzGq5TV2Nc4C/LK/5\noDn4kdPDqa89c7uQcIjPaCFo3J+xaQG9nExEWAjD+sUyrF8skHbGurKq00Nle92ezMGSE+wpKKeo\nvJra+rP/JzgqPOSscEmNjTozeOIiSYmNsB5OJwpkkAwAfM7sIhen19FWmwFAXivvm6aqDevzafrb\n5xKRRcAigEGDBvlftTHdTWg49M10HlzQfJv6emeYzDdgyg6f7u0c+Qx2vgm1VWduJ6EQl976UFpc\nRkAu6x8fFc74zATGZ549hbq+Xik9WUNRRTVF5T4Pn+UDxZVsOHCMoz6XlvHVt0/42aHTzHJSdIRN\nDmhDIIMk4FRVRaTZsTlVfQZ4BpyhrS4tzJhgExICcWnOY8Dk5tuowsljzfdqyg471yvLWQOnKs7e\nNqZf68No8f079fbKISFCYkwEiTERjEhrffJBTV09JRWn3KCpagyaQp8A+jz3OIVl1WecP9MgNERI\njoloMWhSYyPpF+/0emIiQnvl0Fogg+QwMNBnOdN9rb1tmipoGP4SkQygsMOVGmOcg/PRSc4jfVzL\n7arKmg+asiPO5IGD/4Cq42dv59GMtPDQENL7RpHeNwro22rbE9W1Z/VsmvZ2duaVU1zR/NBan/DQ\nVgPn9NBaZI86zyaQQbIBGC4ig3HC4Sbg5iZtVgD3u8dPLgRKfYatWrICuB14xP35t06t2hjTuqh4\n59FvZMttTp04+5hN46SBw85QWlsz0s4YSvMJnaiEgE0SiIkMIyYyjKyUmFbb1dcrx0/W+IRM1Vmh\ns6+4gk/2l3CssqbZ90iIDm9yLCfyrGM5qbGRJHaDobWABYmq1orI/cBKnOm/y1Q1W0Tudtf/FngL\nZ8ZWDs703zsbtheRl3EOqqeISC7wE1V9HidAlovIPwMHgRsC9R2MMecoIgZShjmPlrQ1I61whzOJ\nQOvP3E5CnfvMxKT4/ExpYTnF6WF18oSBkBAhKSaCpJgIzk9vvRd1qraekhMt93CKyqvZcqj1obWU\n2IhmJhFEkhp35kQCr4bW7IREY0zwqqt1Z6T5BExlMZwohsoS96e73NxwGgDiDKs1BkyyEzi+YRPT\nZDkAkwf84c/QWlF5dbuG1m696Lw2jyO1JBim/xpjTMeEhkHfAc6jpRlpDepqnCs3NwZNMZwoOXu5\neA+c+BhOHj27t9MgMr5J76Zp8DTp/XTSpW06a2itsLyavUUVrN9fwoJxGS3Mbe08FiTGmJ4hNPz0\nzDR/1Nc7s9Qqm/ZumoRPaS7kbXGW65s/3kF4dDOB08wwW8P6yLgOXXmgPUNrXcGCxBjTO4WEOP+w\nxyT7114VqsuaH1Y7Y7kIinY6y7Unm3+v0IgWejot9HwCOMGgM1iQGGOMP0Qgqq/zSB7q3zanTrQ+\nzNawfGy/s3yqvIXP9nOCQcPzPknOsGAXsSAxxphAiYhxHonn+de+psrp3bQ0oaBhOf8LPyYYJDjh\n8tXHIesrnfaVmmNBYowxwSI8ymdygR/8mWAQFfi7dFqQGGNMd9XeCQYBErxHb4wxxnQLFiTGGGM6\nxILEGGNMh1iQGGOM6RALEmOMMR1iQWKMMaZDLEiMMcZ0iAWJMcaYDukV9yMRkSKcm2CdixSguBPL\n6SxWV/tYXe1jdbVPsNYFHavtPFVNbatRrwiSjhCRjf7c2KWrWV3tY3W1j9XVPsFaF3RNbTa0ZYwx\npkMsSIwxxnSIBUnbnvG6gBZYXe1jdbWP1dU+wVoXdEFtdozEGGNMh1iPxBhjTIdYkBhjjOkQCxKX\niMwXkV0ikiMiS5pZLyKy1F2/VUQmB0lds0SkVES2uI8fd0FNy0SkUES2tbDeq33VVl1dvq/czx0o\nImtFZLuIZIvIQ8206fJ95mddXvx+RYnIpyLyuVvXz5pp48X+8qcuT37H3M8OFZHPROSNZtYFdn+p\naq9/AKHAXmAIEAF8Doxu0mYB8DYgwHTgkyCpaxbwRhfvr5nAZGBbC+u7fF/5WVeX7yv3czOAye7z\nOGB3kPx++VOXF79fAsS6z8OBT4DpQbC//KnLk98x97P/BfhTc58f6P1lPRLHNCBHVfep6ingFWBh\nkzYLgRfVsR5IEJGMIKiry6nqB8DRVpp4sa/8qcsTqpqnqpvd5+XADqDpTbm7fJ/5WVeXc/dBhbsY\n7j6azgryYn/5U5cnRCQTuAp4roUmAd1fFiSOAcAhn+Vczv6D8qeNF3UBXOx2V98WkTEBrskfXuwr\nf3m6r0QkC5iE83+zvjzdZ63UBR7sM3eYZgtQCKxS1aDYX37UBd78jj0O/CtQ38L6gO4vC5LubzMw\nSFXHA78G/upxPcHM030lIrHAa8BiVS3rys9uTRt1ebLPVLVOVScCmcA0ERnbFZ/bFj/q6vL9JSJX\nA4WquinQn9USCxLHYWCgz3Km+1p723R5Xapa1tDdVtW3gHARSQlwXW3xYl+1yct9JSLhOP9Yv6Sq\nf2mmiSf7rK26vP79UtXjwFpgfpNVnv6OtVSXR/trBnCNiBzAGf6eLSJ/bNImoPvLgsSxARguIoNF\nJAK4CVjRpM0K4DZ39sN0oFRV87yuS0TSRUTc59Nw/puWBLiutnixr9rk1b5yP/N5YIeqPtpCsy7f\nZ/7U5cU+E5FUEUlwn/cB5gE7mzTzYn+1WZcX+0tVf6CqmaqahfNvxLuqekuTZgHdX2Gd9UbdmarW\nisj9wEqcmVLLVDVbRO521/8WeAtn5kMOUAncGSR1XQfcIyK1wEngJnWnaQSKiLyMMzslRURygZ/g\nHHj0bF/5WVeX7yvXDOBW4At3fB3gh8Agn9q82Gf+1OXFPssAXhCRUJx/iJer6hte/z36WZdXv2Nn\n6cr9ZZdIMcYY0yE2tGWMMaZDLEiMMcZ0iAWJMcaYDrEgMcYY0yEWJMYYYzrEgsSYICfOFWXPuqKr\nMcHCgsQYY0yHWJAY00lE5BZx7lexRUR+517gr0JEHhPn/hVrRCTVbTtRRNa7F/d7XUQS3deHichq\nce55sVlEhrpvHysir4rIThF5qeHsaWOCgQWJMZ1AREYBNwIz3Iv61QHfAmKAjao6Bngf52x7gBeB\n77sX9/vC5/WXgCdVdQJwMdBwGYtJwGJgNM79aWYE/EsZ4ye7RIoxnWMOMAXY4HYW+uBcarwe+LPb\n5o/AX0SkL5Cgqu+7r78A/I+IxAEDVPV1AFWtAnDf71NVzXWXtwBZwIeB/1rGtM2CxJjOIcALqvqD\nM14U+VGTdud6TaJqn+d12N+uCSI2tGVM51gDXCci/QBEJElEzsP5G7vObXMz8KGqlgLHROQS9/Vb\ngffduxTmisjX3PeIFJHoLv0WxpwD+78aYzqBqm4XkX8D3hGREKAGuA84gXMDpH/DGeq60d3kduC3\nblDs4/TVWG8Ffici/+6+x/Vd+DWMOSd29V9jAkhEKlQ11us6jAkkG9oyxhjTIdYjMcYY0yHWIzHG\nGNMhFiTGGGM6xILEGGNMh1iQGGOM6RALEmOMMR3y/wPjTSGFAisk0wAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1a261d9ac8>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "print(history.history.keys())\n",
    "\n",
    "plt.plot(history.history['loss'])\n",
    "plt.plot(history.history['val_loss'])\n",
    "plt.title('model loss')\n",
    "plt.ylabel('loss')\n",
    "plt.xlabel('epoch')\n",
    "plt.legend(['train', 'validation'], loc='upper right')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "___"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# **Convolutional autoencoder**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 78,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "X_train shape: (60000, 28, 28, 1)\n",
      "60000 train samples\n",
      "10000 test samples\n"
     ]
    }
   ],
   "source": [
    "nb_classes = 10\n",
    "\n",
    "(X_train, y_train), (X_test, y_test) = mnist.load_data()\n",
    "\n",
    "X_train = X_train.reshape(X_train.shape[0], 28, 28, 1)\n",
    "X_test = X_test.reshape(X_test.shape[0], 28, 28, 1)\n",
    "X_train = X_train.astype(\"float32\")/255.\n",
    "X_test = X_test.astype(\"float32\")/255.\n",
    "print('X_train shape:', X_train.shape)\n",
    "print(X_train.shape[0], 'train samples')\n",
    "print(X_test.shape[0], 'test samples')\n",
    "\n",
    "y_train = np_utils.to_categorical(y_train, nb_classes)\n",
    "y_test = np_utils.to_categorical(y_test, nb_classes)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Create the network"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "This network does not take flattened vectors as an input but images"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 87,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "x = Input(shape=(28, 28,1)) \n",
    "\n",
    "# Encoder\n",
    "conv1_1 = Conv2D(16, (3, 3), activation='relu', padding='same')(x)\n",
    "pool1 = MaxPooling2D((2, 2), padding='same')(conv1_1)\n",
    "conv1_2 = Conv2D(8, (3, 3), activation='relu', padding='same')(pool1)\n",
    "pool2 = MaxPooling2D((2, 2), padding='same')(conv1_2)\n",
    "conv1_3 = Conv2D(8, (3, 3), activation='relu', padding='same')(pool2)\n",
    "h = MaxPooling2D((2, 2), padding='same')(conv1_3)\n",
    "\n",
    "\n",
    "# Decoder\n",
    "conv2_1 = Conv2D(8, (3, 3), activation='relu', padding='same')(h)\n",
    "up1 = UpSampling2D((2, 2))(conv2_1)\n",
    "conv2_2 = Conv2D(8, (3, 3), activation='relu', padding='same')(up1)\n",
    "up2 = UpSampling2D((2, 2))(conv2_2)\n",
    "conv2_3 = Conv2D(16, (3, 3), activation='relu')(up2)\n",
    "up3 = UpSampling2D((2, 2))(conv2_3)\n",
    "r = Conv2D(1, (3, 3), activation='sigmoid', padding='same')(up3)\n",
    "\n",
    "autoencoder = Model(inputs=x, outputs=r)\n",
    "autoencoder.compile(optimizer='adadelta', loss='binary_crossentropy')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 88,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/svg+xml": [
       "<svg height=\"994pt\" viewBox=\"0.00 0.00 226.61 994.00\" width=\"227pt\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n",
       "<g class=\"graph\" id=\"graph0\" transform=\"scale(1 1) rotate(0) translate(4 990)\">\n",
       "<title>G</title>\n",
       "<polygon fill=\"white\" points=\"-4,4 -4,-990 222.61,-990 222.61,4 -4,4\" stroke=\"none\"/>\n",
       "<!-- 112285154552 -->\n",
       "<g class=\"node\" id=\"node1\"><title>112285154552</title>\n",
       "<polygon fill=\"none\" points=\"41.624,-949.5 41.624,-985.5 176.986,-985.5 176.986,-949.5 41.624,-949.5\" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"109.305\" y=\"-963.3\">input_14: InputLayer</text>\n",
       "</g>\n",
       "<!-- 112251134752 -->\n",
       "<g class=\"node\" id=\"node2\"><title>112251134752</title>\n",
       "<polygon fill=\"none\" points=\"42.7793,-876.5 42.7793,-912.5 175.831,-912.5 175.831,-876.5 42.7793,-876.5\" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"109.305\" y=\"-890.3\">conv2d_35: Conv2D</text>\n",
       "</g>\n",
       "<!-- 112285154552&#45;&gt;112251134752 -->\n",
       "<g class=\"edge\" id=\"edge1\"><title>112285154552-&gt;112251134752</title>\n",
       "<path d=\"M109.305,-949.313C109.305,-941.289 109.305,-931.547 109.305,-922.569\" fill=\"none\" stroke=\"black\"/>\n",
       "<polygon fill=\"black\" points=\"112.805,-922.529 109.305,-912.529 105.805,-922.529 112.805,-922.529\" stroke=\"black\"/>\n",
       "</g>\n",
       "<!-- 112251753024 -->\n",
       "<g class=\"node\" id=\"node3\"><title>112251753024</title>\n",
       "<polygon fill=\"none\" points=\"0,-803.5 0,-839.5 218.61,-839.5 218.61,-803.5 0,-803.5\" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"109.305\" y=\"-817.3\">max_pooling2d_15: MaxPooling2D</text>\n",
       "</g>\n",
       "<!-- 112251134752&#45;&gt;112251753024 -->\n",
       "<g class=\"edge\" id=\"edge2\"><title>112251134752-&gt;112251753024</title>\n",
       "<path d=\"M109.305,-876.313C109.305,-868.289 109.305,-858.547 109.305,-849.569\" fill=\"none\" stroke=\"black\"/>\n",
       "<polygon fill=\"black\" points=\"112.805,-849.529 109.305,-839.529 105.805,-849.529 112.805,-849.529\" stroke=\"black\"/>\n",
       "</g>\n",
       "<!-- 112251134528 -->\n",
       "<g class=\"node\" id=\"node4\"><title>112251134528</title>\n",
       "<polygon fill=\"none\" points=\"42.7793,-730.5 42.7793,-766.5 175.831,-766.5 175.831,-730.5 42.7793,-730.5\" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"109.305\" y=\"-744.3\">conv2d_36: Conv2D</text>\n",
       "</g>\n",
       "<!-- 112251753024&#45;&gt;112251134528 -->\n",
       "<g class=\"edge\" id=\"edge3\"><title>112251753024-&gt;112251134528</title>\n",
       "<path d=\"M109.305,-803.313C109.305,-795.289 109.305,-785.547 109.305,-776.569\" fill=\"none\" stroke=\"black\"/>\n",
       "<polygon fill=\"black\" points=\"112.805,-776.529 109.305,-766.529 105.805,-776.529 112.805,-776.529\" stroke=\"black\"/>\n",
       "</g>\n",
       "<!-- 112215025592 -->\n",
       "<g class=\"node\" id=\"node5\"><title>112215025592</title>\n",
       "<polygon fill=\"none\" points=\"0,-657.5 0,-693.5 218.61,-693.5 218.61,-657.5 0,-657.5\" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"109.305\" y=\"-671.3\">max_pooling2d_16: MaxPooling2D</text>\n",
       "</g>\n",
       "<!-- 112251134528&#45;&gt;112215025592 -->\n",
       "<g class=\"edge\" id=\"edge4\"><title>112251134528-&gt;112215025592</title>\n",
       "<path d=\"M109.305,-730.313C109.305,-722.289 109.305,-712.547 109.305,-703.569\" fill=\"none\" stroke=\"black\"/>\n",
       "<polygon fill=\"black\" points=\"112.805,-703.529 109.305,-693.529 105.805,-703.529 112.805,-703.529\" stroke=\"black\"/>\n",
       "</g>\n",
       "<!-- 112251907152 -->\n",
       "<g class=\"node\" id=\"node6\"><title>112251907152</title>\n",
       "<polygon fill=\"none\" points=\"42.7793,-584.5 42.7793,-620.5 175.831,-620.5 175.831,-584.5 42.7793,-584.5\" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"109.305\" y=\"-598.3\">conv2d_37: Conv2D</text>\n",
       "</g>\n",
       "<!-- 112215025592&#45;&gt;112251907152 -->\n",
       "<g class=\"edge\" id=\"edge5\"><title>112215025592-&gt;112251907152</title>\n",
       "<path d=\"M109.305,-657.313C109.305,-649.289 109.305,-639.547 109.305,-630.569\" fill=\"none\" stroke=\"black\"/>\n",
       "<polygon fill=\"black\" points=\"112.805,-630.529 109.305,-620.529 105.805,-630.529 112.805,-630.529\" stroke=\"black\"/>\n",
       "</g>\n",
       "<!-- 112217220600 -->\n",
       "<g class=\"node\" id=\"node7\"><title>112217220600</title>\n",
       "<polygon fill=\"none\" points=\"0,-511.5 0,-547.5 218.61,-547.5 218.61,-511.5 0,-511.5\" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"109.305\" y=\"-525.3\">max_pooling2d_17: MaxPooling2D</text>\n",
       "</g>\n",
       "<!-- 112251907152&#45;&gt;112217220600 -->\n",
       "<g class=\"edge\" id=\"edge6\"><title>112251907152-&gt;112217220600</title>\n",
       "<path d=\"M109.305,-584.313C109.305,-576.289 109.305,-566.547 109.305,-557.569\" fill=\"none\" stroke=\"black\"/>\n",
       "<polygon fill=\"black\" points=\"112.805,-557.529 109.305,-547.529 105.805,-557.529 112.805,-557.529\" stroke=\"black\"/>\n",
       "</g>\n",
       "<!-- 112252286232 -->\n",
       "<g class=\"node\" id=\"node8\"><title>112252286232</title>\n",
       "<polygon fill=\"none\" points=\"42.7793,-438.5 42.7793,-474.5 175.831,-474.5 175.831,-438.5 42.7793,-438.5\" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"109.305\" y=\"-452.3\">conv2d_38: Conv2D</text>\n",
       "</g>\n",
       "<!-- 112217220600&#45;&gt;112252286232 -->\n",
       "<g class=\"edge\" id=\"edge7\"><title>112217220600-&gt;112252286232</title>\n",
       "<path d=\"M109.305,-511.313C109.305,-503.289 109.305,-493.547 109.305,-484.569\" fill=\"none\" stroke=\"black\"/>\n",
       "<polygon fill=\"black\" points=\"112.805,-484.529 109.305,-474.529 105.805,-484.529 112.805,-484.529\" stroke=\"black\"/>\n",
       "</g>\n",
       "<!-- 112229763056 -->\n",
       "<g class=\"node\" id=\"node9\"><title>112229763056</title>\n",
       "<polygon fill=\"none\" points=\"0,-365.5 0,-401.5 218.61,-401.5 218.61,-365.5 0,-365.5\" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"109.305\" y=\"-379.3\">up_sampling2d_15: UpSampling2D</text>\n",
       "</g>\n",
       "<!-- 112252286232&#45;&gt;112229763056 -->\n",
       "<g class=\"edge\" id=\"edge8\"><title>112252286232-&gt;112229763056</title>\n",
       "<path d=\"M109.305,-438.313C109.305,-430.289 109.305,-420.547 109.305,-411.569\" fill=\"none\" stroke=\"black\"/>\n",
       "<polygon fill=\"black\" points=\"112.805,-411.529 109.305,-401.529 105.805,-411.529 112.805,-411.529\" stroke=\"black\"/>\n",
       "</g>\n",
       "<!-- 112217291576 -->\n",
       "<g class=\"node\" id=\"node10\"><title>112217291576</title>\n",
       "<polygon fill=\"none\" points=\"42.7793,-292.5 42.7793,-328.5 175.831,-328.5 175.831,-292.5 42.7793,-292.5\" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"109.305\" y=\"-306.3\">conv2d_39: Conv2D</text>\n",
       "</g>\n",
       "<!-- 112229763056&#45;&gt;112217291576 -->\n",
       "<g class=\"edge\" id=\"edge9\"><title>112229763056-&gt;112217291576</title>\n",
       "<path d=\"M109.305,-365.313C109.305,-357.289 109.305,-347.547 109.305,-338.569\" fill=\"none\" stroke=\"black\"/>\n",
       "<polygon fill=\"black\" points=\"112.805,-338.529 109.305,-328.529 105.805,-338.529 112.805,-338.529\" stroke=\"black\"/>\n",
       "</g>\n",
       "<!-- 112235725880 -->\n",
       "<g class=\"node\" id=\"node11\"><title>112235725880</title>\n",
       "<polygon fill=\"none\" points=\"0,-219.5 0,-255.5 218.61,-255.5 218.61,-219.5 0,-219.5\" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"109.305\" y=\"-233.3\">up_sampling2d_16: UpSampling2D</text>\n",
       "</g>\n",
       "<!-- 112217291576&#45;&gt;112235725880 -->\n",
       "<g class=\"edge\" id=\"edge10\"><title>112217291576-&gt;112235725880</title>\n",
       "<path d=\"M109.305,-292.313C109.305,-284.289 109.305,-274.547 109.305,-265.569\" fill=\"none\" stroke=\"black\"/>\n",
       "<polygon fill=\"black\" points=\"112.805,-265.529 109.305,-255.529 105.805,-265.529 112.805,-265.529\" stroke=\"black\"/>\n",
       "</g>\n",
       "<!-- 112235779128 -->\n",
       "<g class=\"node\" id=\"node12\"><title>112235779128</title>\n",
       "<polygon fill=\"none\" points=\"42.7793,-146.5 42.7793,-182.5 175.831,-182.5 175.831,-146.5 42.7793,-146.5\" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"109.305\" y=\"-160.3\">conv2d_40: Conv2D</text>\n",
       "</g>\n",
       "<!-- 112235725880&#45;&gt;112235779128 -->\n",
       "<g class=\"edge\" id=\"edge11\"><title>112235725880-&gt;112235779128</title>\n",
       "<path d=\"M109.305,-219.313C109.305,-211.289 109.305,-201.547 109.305,-192.569\" fill=\"none\" stroke=\"black\"/>\n",
       "<polygon fill=\"black\" points=\"112.805,-192.529 109.305,-182.529 105.805,-192.529 112.805,-192.529\" stroke=\"black\"/>\n",
       "</g>\n",
       "<!-- 112235726496 -->\n",
       "<g class=\"node\" id=\"node13\"><title>112235726496</title>\n",
       "<polygon fill=\"none\" points=\"0,-73.5 0,-109.5 218.61,-109.5 218.61,-73.5 0,-73.5\" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"109.305\" y=\"-87.3\">up_sampling2d_17: UpSampling2D</text>\n",
       "</g>\n",
       "<!-- 112235779128&#45;&gt;112235726496 -->\n",
       "<g class=\"edge\" id=\"edge12\"><title>112235779128-&gt;112235726496</title>\n",
       "<path d=\"M109.305,-146.313C109.305,-138.289 109.305,-128.547 109.305,-119.569\" fill=\"none\" stroke=\"black\"/>\n",
       "<polygon fill=\"black\" points=\"112.805,-119.529 109.305,-109.529 105.805,-119.529 112.805,-119.529\" stroke=\"black\"/>\n",
       "</g>\n",
       "<!-- 112235195640 -->\n",
       "<g class=\"node\" id=\"node14\"><title>112235195640</title>\n",
       "<polygon fill=\"none\" points=\"42.7793,-0.5 42.7793,-36.5 175.831,-36.5 175.831,-0.5 42.7793,-0.5\" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"109.305\" y=\"-14.3\">conv2d_41: Conv2D</text>\n",
       "</g>\n",
       "<!-- 112235726496&#45;&gt;112235195640 -->\n",
       "<g class=\"edge\" id=\"edge13\"><title>112235726496-&gt;112235195640</title>\n",
       "<path d=\"M109.305,-73.3129C109.305,-65.2895 109.305,-55.5475 109.305,-46.5691\" fill=\"none\" stroke=\"black\"/>\n",
       "<polygon fill=\"black\" points=\"112.805,-46.5288 109.305,-36.5288 105.805,-46.5289 112.805,-46.5288\" stroke=\"black\"/>\n",
       "</g>\n",
       "</g>\n",
       "</svg>"
      ],
      "text/plain": [
       "<IPython.core.display.SVG object>"
      ]
     },
     "execution_count": 88,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from IPython.display import SVG\n",
    "from keras.utils.vis_utils import model_to_dot\n",
    "\n",
    "SVG(model_to_dot(autoencoder).create(prog='dot', format='svg'))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Train"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 89,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train on 60000 samples, validate on 10000 samples\n",
      "Epoch 1/3\n",
      "60000/60000 [==============================] - 79s - loss: 0.2290 - val_loss: 0.1701\n",
      "Epoch 2/3\n",
      "60000/60000 [==============================] - 80s - loss: 0.1612 - val_loss: 0.1497\n",
      "Epoch 3/3\n",
      "60000/60000 [==============================] - 80s - loss: 0.1471 - val_loss: 0.1429\n"
     ]
    }
   ],
   "source": [
    "epochs = 3\n",
    "batch_size = 128\n",
    "\n",
    "history = autoencoder.fit(X_train, X_train, batch_size=batch_size, epochs=epochs, verbose=1, validation_data=(X_test, X_test))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 90,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "decoded_imgs = autoencoder.predict(X_test)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Plot"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 91,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\nje12QTnuuOMs9hURZs+ebXE+K7lpWpxPnxo5cqTFX331Vb52qWgdcMABKdt81Zt06YzYUGlpabSt\n3/VFixZFbbmsMLT11ltH25oqcN5551ns97d///4526dCoOkRIYSw/fbbW6zVbPw9i16fTj75ZIt9\nCkezZs0srlevXtT2wgsvWHzooYdavHLlyoz2vRhst912FvslE3TZhRUrVkRtt9xyi8UsrVB1+Ps6\nrQp11llnRW0lJSUW6+8Cn2o/cOBAiyu6/EKtWrUs1iqp11xzTdRPl3XxqZiVhZk4AAAAAAAACcBD\nHAAAAAAAgATgIQ4AAAAAAEACJH5NnFyoW7euxXfffbfFm20WP/PS8tfksVbc888/H2337t27zH6P\nPPJItO3L7SIZ2rVrl7JN10XBptl88/+e3jNdA8evLXXSSSdZ7PPOM6Vr4tx0000W33bbbVG/bbbZ\nxmL/PXjxxRctnjNnToX2I6mOP/54i/UzCiG+PuWarrF06qmnWvzzzz9H/W644QaLi239onzRkqga\ne36NgEmTJuVsn4rNYYcdFm1r+XZdC8qv4ZApXYelR48eUVv37t3L/JshQ4ZU6L2K1ZZbbhlt65pC\nf//731P+nZYrfuihhyzWc3UIITRt2jTla+haLblcTynJjjrqKIv/9Kc/RW1a9nv//feP2lavXp3b\nHUOF+PPYpZdearGugRNCCAsXLrRY16Z9//33K/TeutZNgwYNojb9bfnqq69a7NfBVX5/H330UYvz\nuRYgM3EAAAAAAAASgIc4AAAAAAAACUA6VRnOP/98i7UMri9nPnPmzLztU6HZZZddLPbTwXWKq6Zw\n6DT9EEJYs2ZNjvYO2abTv88444yo7aOPPrJ4+PDhedsn/IeWpvYlaSuaQpWKpkVpSk4IIey1115Z\nfa+kqlGjRrSdKnUihIqnalSElofX9Lzp06dH/d5+++287VOxynSs5PP7UYhuv/32aLtnz54W169f\nP2rTUu861f6II46o0Hvra/jS4eqzzz6z2Je4RnpaHtzTdDmf8p9Kly5dMn7v8ePHW8y9bNnSpYrq\nfeOCBQvysTvYRJrSFMKGqdjqp59+srhbt24WH3fccVG/PfbYo8y/X7t2bbTdqlWrMuMQ4vvcnXfe\nOeU+qaVLl0bblZVGzkwcAAAAAACABOAhDgAAAAAAQAKQThVC2HfffaNtvwr6L3Sl9BBCmDp1as72\n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\nHUF6paWlJdl4nap4DEtKStJu/6K0tDTtdgKsKC0trZONF6qKx7FYFPJYLCKMxQLAWCwIjMUCwFgs\nCIzFAsBYLAgZjcVyPcQBskUf1FSvXj1q23zz/34tq1WrZvG6deuifj/++KPF69evz/Yu5sK8yt6B\nJEv1cC+ERD7QQ+ViLAJVA2MRqBoYi0DVkNFY5CEOKoX+IN9sszirb4sttrA43Y9zfrgXL449AAAA\ngGLEmjgAAAAAAAAJwEMcAAAAAACABOAhDgAAAAAAQAKwJg7yZptttrG4Ro0aFjdp0iTqt/XWW1u8\nevVqi1euXBn1W7hwocU//PBD1vYTVYcucq1rJ/lFrlkjBwAAAFUZRTqQLczEAQAAAAAASAAe4gAA\nAAAAACQA6VTIme222y7a3meffSyuVauWxa1atYr6rVixwuIZM2ZYvH79+qifTklcsGBB1EZ6VTJp\nml0IIbRr187iNWvWWPz5559H/TTtDrmx5ZZblhmHEKe3ff/991Eb04OBqkevn4xRANg0mvKvSwGE\nEP8e0iUjQgjhp59+sljvn7777ruo388//2yx/z2E4sRMHAAAAAAAgATgIQ4AAAAAAEAC8BAHAAAA\nAAAgAVgTB1mlZcRPO+20qO2MM86weIsttrB4++23j/p9+umnFjdq1MjixYsXR/3q169v8bhx46K2\n1157zWJdSwVVjx7/q666Kmo79thjLf7ss88svvbaa6N+o0ePztHeFZdq1apF2/vvv7/FF154ocXV\nq1eP+i1cuNDiBx54IGr78MMPLdbcbwC5pdfZEELo2LGjxXXr1rVY154LIYTZs2fndscKgK5/EUK8\nxpCuXQEg2XQNwG233TZq098hO+64o8W6nmMIITRr1szimjVrRm26Jpmug/PBBx9E/SZOnGjxrFmz\norZf7q1Y36y4MBMHAAAAAAAgAXiIAwAAAAAAkACkUyGrdtppJ4s7dOgQtem0Qy2x56ce67RDLTn9\n9ddfR/06depk8cEHHxy1aXrH2LFjM9p35Iefhn7CCSdY7FPwtCzjokWLLJ4+fXqO9q74aCnMG2+8\nMWo7+eSTLdYy4po6EEIInTt3LjMOIYSBAwda/NZbb1m8fPnyqB/TgDdOx0MIIbRp06bMft988020\nramIvgR8RfgxnAplUPNPr8G33HJL1HbAAQdYrN+Dxx9/POr3f//3fxYX87j05zkdbxdddFHUNmLE\n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\nnU6lU8N1ylUIcblOP7VKp1M988wzFk+YMCHbu1hwdGqkn2580003WazpEj6tQksZa5tPCdH38lMy\nmcaffw0bNoy2daq4jj8//X/y5MkW61R2lI8vfaklxn0q4rRp0ywePHiwxe+++27UT6eT6pRiP7VZ\nx6YfpzqNXKfW+rQ6/V74tDpN6yrEsa3/Jl/eVMta+jGm04x1jGm6RQghjB071mI9dn6Kv045btu2\nbdSmf6dTnxcsWBD109QtVJwvparTyPVY+PPpokWLLB43blyO9q5waUrM119/HbVpOpWmDYYQf9Z6\n3vTp+pqOofc3/jhqapTeE4UQwpAhQyz+/PPPy/hXIBX9XCdOnBi1aUqcjj9/ntTXSFfqWvv587oe\nbz13+5L0mk711ltvRW0+BSWJ/Gc7fPhwi3v37m2xH0d6PvT3/19++aXFmpbo0670HildKo7+RvS/\na/S+SI+//25puk0x0Xsbn+45ZswYiz/88MOo7aGHHrL47LPPtth//noO3X333S1O95vwhx9+iNp0\nv1544QWLH3vssaifpqxXldRVZuIAAAAAAAAkAA9xAAAAAAAAEoCHOAAAAAAAAAlQcGviaB6clqdr\n1qxZ1E/L7/ry47r+gpZq9Xl02JCWbBw4cGDU1qZNG4v1M9f81RDinHT9zP06HNrm82o1V7gy84a1\ndF0hlnfVHOB99tknatP1O/TfvmLFiqifrjvl10lB5vz40GPjS2Z+8cUXFusaJj5vX4+brrnj30tz\n+uvWrRu16blWzw/+vKtj2K/zoKVVC3FNHOXLWl5//fUWDxgwIGrTHPA1a9ZY7PP7de0cXffG034+\n91w/dz1WWqI+hA3XX0Lm9P5F1+cIIR472k+PewghPP/88xb77xI2jY4Bv4aNnqMeeOABi9u3bx/1\n0zVPGjVqZLG/v1yyZInFn332WdSm60UU4n1FLun6Qk899VTUpufGPn36WOzXUtFznLb5den0uuvX\nitPrs5a67ty5c9RPz/kzZsyI2vx6ZEnkr+daxvmOO+6w2H8uumabrnsTQnze07Vz/O8EXetG72H8\nmEp3zdTX1DV2fCnspUuXWlwIaxllQ7q1APV3+F133WVxz549o356DtV1rPx9iI4xPbf619d1IZNw\nL8NMHAAAAAAAgATgIQ4AAAAAAEACFHQ6lU5t02niIcTTHn35Ri0VSfnG9HwZt3333dfiLl26RG06\n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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1a205c8dd8>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "n = 10\n",
    "plt.figure(figsize=(20, 6))\n",
    "for i in range(n):\n",
    "    # display original\n",
    "    ax = plt.subplot(3, n, i+1)\n",
    "    plt.imshow(X_test[i].reshape(28, 28))\n",
    "    plt.gray()\n",
    "    ax.get_xaxis().set_visible(False)\n",
    "    ax.get_yaxis().set_visible(False)\n",
    "\n",
    "    \n",
    "    # display reconstruction\n",
    "    ax = plt.subplot(3, n, i+n+1)\n",
    "    plt.imshow(decoded_imgs[i].reshape(28, 28))\n",
    "    plt.gray()\n",
    "    ax.get_xaxis().set_visible(False)\n",
    "    ax.get_yaxis().set_visible(False)\n",
    "    \n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Plot the losses"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 92,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "dict_keys(['val_loss', 'loss'])\n"
     ]
    },
    {
     "data": {
      "image/png": "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\niQJDRERC8v8B9xxLQ4A5pVoAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1a2214afd0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "print(history.history.keys())\n",
    "\n",
    "plt.plot(history.history['loss'])\n",
    "plt.plot(history.history['val_loss'])\n",
    "plt.title('model loss')\n",
    "plt.ylabel('loss')\n",
    "plt.xlabel('epoch')\n",
    "plt.legend(['train', 'validation'], loc='upper right')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "___"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# **Regularized autoencoder**"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Two types of regularization are described : \n",
    "- Sparse autoencoder\n",
    "- Denoising autoencoder"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 1. Sparse autoencoder"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Create the network"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "input_size = 784\n",
    "hidden_size = 32\n",
    "output_size = 784"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "x = Input(shape=(input_size,))\n",
    "h = Dense(hidden_size, activation='relu', activity_regularizer=regularizers.l1(10e-5))(x)\n",
    "r = Dense(output_size, activation='sigmoid')(h)\n",
    "\n",
    "autoencoder = Model(inputs=x, outputs=r)\n",
    "autoencoder.compile(optimizer='adam', loss='mse')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/svg+xml": [
       "<svg height=\"191pt\" viewBox=\"0.00 0.00 136.36 191.00\" width=\"136pt\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n",
       "<g class=\"graph\" id=\"graph0\" transform=\"scale(1 1) rotate(0) translate(4 187)\">\n",
       "<title>G</title>\n",
       "<polygon fill=\"white\" points=\"-4,4 -4,-187 132.362,-187 132.362,4 -4,4\" stroke=\"none\"/>\n",
       "<!-- 112227364992 -->\n",
       "<g class=\"node\" id=\"node1\"><title>112227364992</title>\n",
       "<polygon fill=\"none\" points=\"0,-146.5 0,-182.5 128.362,-182.5 128.362,-146.5 0,-146.5\" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"64.1812\" y=\"-160.3\">input_5: InputLayer</text>\n",
       "</g>\n",
       "<!-- 112479820544 -->\n",
       "<g class=\"node\" id=\"node2\"><title>112479820544</title>\n",
       "<polygon fill=\"none\" points=\"12.0552,-73.5 12.0552,-109.5 116.307,-109.5 116.307,-73.5 12.0552,-73.5\" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"64.1812\" y=\"-87.3\">dense_9: Dense</text>\n",
       "</g>\n",
       "<!-- 112227364992&#45;&gt;112479820544 -->\n",
       "<g class=\"edge\" id=\"edge1\"><title>112227364992-&gt;112479820544</title>\n",
       "<path d=\"M64.1812,-146.313C64.1812,-138.289 64.1812,-128.547 64.1812,-119.569\" fill=\"none\" stroke=\"black\"/>\n",
       "<polygon fill=\"black\" points=\"67.6813,-119.529 64.1812,-109.529 60.6813,-119.529 67.6813,-119.529\" stroke=\"black\"/>\n",
       "</g>\n",
       "<!-- 112231807576 -->\n",
       "<g class=\"node\" id=\"node3\"><title>112231807576</title>\n",
       "<polygon fill=\"none\" points=\"8.55518,-0.5 8.55518,-36.5 119.807,-36.5 119.807,-0.5 8.55518,-0.5\" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"64.1812\" y=\"-14.3\">dense_10: Dense</text>\n",
       "</g>\n",
       "<!-- 112479820544&#45;&gt;112231807576 -->\n",
       "<g class=\"edge\" id=\"edge2\"><title>112479820544-&gt;112231807576</title>\n",
       "<path d=\"M64.1812,-73.3129C64.1812,-65.2895 64.1812,-55.5475 64.1812,-46.5691\" fill=\"none\" stroke=\"black\"/>\n",
       "<polygon fill=\"black\" points=\"67.6813,-46.5288 64.1812,-36.5288 60.6813,-46.5289 67.6813,-46.5288\" stroke=\"black\"/>\n",
       "</g>\n",
       "</g>\n",
       "</svg>"
      ],
      "text/plain": [
       "<IPython.core.display.SVG object>"
      ]
     },
     "execution_count": 27,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from IPython.display import SVG\n",
    "from keras.utils.vis_utils import model_to_dot\n",
    "\n",
    "SVG(model_to_dot(autoencoder).create(prog='dot', format='svg'))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train on 60000 samples, validate on 10000 samples\n",
      "Epoch 1/15\n",
      "60000/60000 [==============================] - 2s - loss: 0.0536 - val_loss: 0.0307\n",
      "Epoch 2/15\n",
      "60000/60000 [==============================] - 2s - loss: 0.0253 - val_loss: 0.0209\n",
      "Epoch 3/15\n",
      "60000/60000 [==============================] - 2s - loss: 0.0186 - val_loss: 0.0160\n",
      "Epoch 4/15\n",
      "60000/60000 [==============================] - 2s - loss: 0.0148 - val_loss: 0.0131\n",
      "Epoch 5/15\n",
      "60000/60000 [==============================] - 2s - loss: 0.0127 - val_loss: 0.0116\n",
      "Epoch 6/15\n",
      "60000/60000 [==============================] - 2s - loss: 0.0116 - val_loss: 0.0108\n",
      "Epoch 7/15\n",
      "60000/60000 [==============================] - 2s - loss: 0.0110 - val_loss: 0.0105\n",
      "Epoch 8/15\n",
      "60000/60000 [==============================] - 2s - loss: 0.0107 - val_loss: 0.0103\n",
      "Epoch 9/15\n",
      "60000/60000 [==============================] - 2s - loss: 0.0106 - val_loss: 0.0101\n",
      "Epoch 10/15\n",
      "60000/60000 [==============================] - 2s - loss: 0.0105 - val_loss: 0.0101\n",
      "Epoch 11/15\n",
      "60000/60000 [==============================] - 2s - loss: 0.0104 - val_loss: 0.0100\n",
      "Epoch 12/15\n",
      "60000/60000 [==============================] - 2s - loss: 0.0103 - val_loss: 0.0099\n",
      "Epoch 13/15\n",
      "60000/60000 [==============================] - 2s - loss: 0.0103 - val_loss: 0.0099\n",
      "Epoch 14/15\n",
      "60000/60000 [==============================] - 2s - loss: 0.0102 - val_loss: 0.0099\n",
      "Epoch 15/15\n",
      "60000/60000 [==============================] - 2s - loss: 0.0102 - val_loss: 0.0099\n"
     ]
    }
   ],
   "source": [
    "epochs = 15\n",
    "batch_size = 128\n",
    "\n",
    "history = autoencoder.fit(X_train, X_train, batch_size=batch_size, epochs=epochs, verbose=1, validation_data=(X_test, X_test))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Predict on the test set"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "decoded_imgs = autoencoder.predict(X_test)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Plot"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAABHEAAADnCAYAAACZmMoMAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3We8FEX2//HCjAkFQUUUFMQACApiWBPKy4BiBOPPHDCs\ncQ37dw2Y45oju2vCiBEjplUU44IIBlBBiRJFUczh/h/48vitw+1m7jAz93bP5/3otFV3ppme6u5p\n69RpVFNTEwAAAAAAANCwLVLfOwAAAAAAAIAF4yEOAAAAAABABvAQBwAAAAAAIAN4iAMAAAAAAJAB\nPMQBAAAAAADIAB7iAAAAAAAAZAAPcQAAAAAAADKAhzgAAAAAAAAZwEMcAAAAAACADOAhDgAAAAAA\nQAYsVpfOjRo1qinXjiBdTU1No1K8DsewXs2uqalpXooX4jjWH8ZiLjAWc4CxmAuMxRxgLOYCYzEH\nGIu5UNBYZCYOUDkT63sHAIQQGItAQ8FYBBoGxiLQMBQ0FnmIAwAAAAAAkAE8xAEAAAAAAMgAHuIA\nAAAAAABkAA9xAAAAAAAAMoCHOAAAAAAAABnAQxwAAAAAAIAM4CEOAAAAAABABixW3zuA6nTqqada\n3Lhx46htgw02sLhPnz6Jr3HzzTdb/MYbb0RtAwcOXNhdBAAAAACgQWEmDgAAAAAAQAbwEAcAAAAA\nACADeIgDAAAAAACQAayJg4p54IEHLE5b60b99ttviW39+vWzuGfPnlHb0KFDLZ40aVKhu4h61r59\n+2h77NixFp944okWX3/99RXbp2q2zDLLWHzFFVdYrGMvhBBGjBhhcd++faO2iRMnlmnvAAAA6seK\nK65o8RprrFHQ3/h7opNPPtni999/3+KPP/446jdq1KhidhE5xkwcAAAAAACADOAhDgAAAAAAQAaQ\nToWy0fSpEApPodIUmmeffdbitdZaK+rXu3dvi9u2bRu1HXDAARZfcsklBb0v6t+GG24YbWs63ZQp\nUyq9O1Vv1VVXtfjII4+02Kc5du3a1eJddtklarvxxhvLtHdQG220kcWPPPJI1NamTZuyve/2228f\nbY8ZM8biyZMnl+19sWB6jQwhhMcff9ziv/71rxbfcsstUb9ff/21vDuWQy1atLB40KBBFr/++utR\nvwEDBlg8YcKEsu/XH5o0aRJtb7XVVhYPGTLE4p9//rli+wRkwc4772zxrrvuGrVts802Frdr166g\n1/NpUq1bt7Z4ySWXTPy7RRddtKDXR/VgJg4AAAAAAEAG8BAHAAAAAAAgA0inQkl169bN4j322COx\n3wcffGCxn544e/Zsi+fNm2fxEkssEfV78803Le7cuXPU1qxZswL3GA1Jly5dou1vv/3W4kcffbTS\nu1N1mjdvHm3feeed9bQnqKsddtjB4rQp2aXmU3YOO+wwi/fdd9+K7Qd+p9e+m266KbHfDTfcYPFt\nt90WtX3//fel37Gc0ao0IcT3NJq6NGPGjKhffaVQaQXBEOJzvabDjhs3rvw7ljHLL798tK0p+h07\ndrTYV0klNa1h02UYjjvuOIs1dTyEEBo3bmxxo0aNFvp9fRVWoFjMxAEAAAAAAMgAHuIAAAAAAABk\nAA9xAAAAAAAAMqBe18TxJac1D/Hzzz+P2n744QeL77nnHounT58e9SOft35pSWKfO6o547p+w7Rp\n0wp67b/97W/R9vrrr5/Y96mnniroNVH/NKdcy96GEMLAgQMrvTtV54QTTrB49913j9q6d+9e59fT\n0rUhhLDIIn/+v4JRo0ZZ/Morr9T5tRFbbLE/L+G9evWql33wa22ccsopFi+zzDJRm65xhfLQ8deq\nVavEfvfdd5/Fen+FZCuttJLFDzzwQNTWtGlTi3UtouOPP778O5bgrLPOsnjNNdeM2vr162cx983z\nO+CAAyy+6KKLorbVV1+91r/xa+d88cUXpd8xlIyeH0888cSyvtfYsWMt1t9CKB0t8a7n6hDiNVq1\nLHwIIfz2228W33LLLRa/9tprUb+GeJ5kJg4AAAAAAEAG8BAHAAAAAAAgA+o1neryyy+Pttu0aVPQ\n3+k00G+++SZqq+Q0tSlTpljs/y3Dhw+v2H40JE888YTFOrUthPhYzZkzp86v7cvVLr744nV+DTQ8\n6667rsU+/cJPWUfpXX311RbrtNJi7bnnnonbEydOtHifffaJ+vm0HCxYjx49LN5ss80s9tejcvKl\nljXNdemll47aSKcqPV9O/h//+EdBf6epqjU1NSXdp7zaaKONLPZT8tX5559fgb2ZX4cOHaJtTUF/\n9NFHozaurfPT9JprrrnG4mbNmkX9ksbL9ddfH21rengx97wojE+d0dQoTYkZMmRI1O/HH3+0eO7c\nuRb765Telz733HNR2/vvv2/xW2+9ZfHIkSOjft9//33i66NwuvxCCPEY03tN/50o1CabbGLxL7/8\nErV99NFHFg8bNixq0+/cTz/9VNR7F4OZOAAAAAAAABnAQxwAAAAAAIAM4CEOAAAAAABABtTrmjha\nUjyEEDbYYAOLx4wZE7Wtt956FqflJW+66aYWT5482eKkkoC10Ty4WbNmWazls71JkyZF29W6Jo7S\n9S+Kddppp1ncvn37xH6ai1rbNhqu008/3WL/nWEclcfTTz9tsZYAL5aWUp03b17U1rp1a4u1zO3b\nb78d9Vt00UUXej/yzueDa5no8ePHW3zxxRdXbJ922223ir0X5tepU6dou2vXrol99d7mmWeeKds+\n5UWLFi2i7b322iux7+GHH26x3jeWm66D88ILLyT282vi+PUkEcKpp55qsZaML5Rf523HHXe02Jcp\n1/VzKrmGRl6krVPTuXNni7W0tPfmm29arL8rJ0yYEPVbY401LNa1UEMozTqCmJ8+DzjuuOMs9mNs\n+eWXr/Xvp06dGm2/+uqrFn/22WdRm/4G0bUZu3fvHvXTc0KvXr2itlGjRlmsZcrLjZk4AAAAAAAA\nGcBDHAAAAAAAgAyo13SqF198MXVb+dJwf/DlTbt06WKxTovaeOONC96vH374weKPP/7YYp/ipVOr\ndCo7Fs4uu+xisZbqXGKJJaJ+M2fOtPj//b//F7V99913Zdo7LKw2bdpE2926dbNYx1sIlGIsla23\n3jraXmeddSzW6cCFTg3200V1OrOW6gwhhG233dbitPLHxxxzjMU333xzQftRbc4666xoW6eU69R9\nn9JWanrt898tppdXVlqKj+fTDpDun//8Z7T9f//3fxbr/WUIITz44IMV2Sdvyy23tHjllVeO2u64\n4w6L77777krtUmZoqm8IIRx66KG19hs9enS0PWPGDIt79uyZ+PpNmjSxWFO1QgjhnnvusXj69OkL\n3tkq5+//7733Xos1fSqEOJ04LcVQ+RQq5ZfLQOndeuut0bamwaWVC9fnBu+9957FZ555ZtRPf9d7\nm2++ucV6H3rbbbdF/fT5gp4DQgjhxhtvtPjhhx+2uNyptczEAQAAAAAAyAAe4gAAAAAAAGRAvaZT\nlcKXX34Zbb/00ku19ktL1UqjU5V96pZO3XrggQeKen3MT9Nr/BRKpZ/50KFDy7pPKB2ffqEqWdUj\n7zRt7f7774/a0qanKq0WplNEzzvvvKhfWvqivsZRRx1lcfPmzaN+l19+ucVLLbVU1HbDDTdY/PPP\nPy9ot3OlT58+FvuKCOPGjbO4kpXcNC3Op0+9/PLLFn/11VeV2qWqtdVWWyW2+ao3aemMmF9NTU20\nrd/1zz//PGorZ4Whxo0bR9uaKnDsscda7Pf3sMMOK9s+5YGmR4QQwnLLLWexVrPx9yx6fdpvv/0s\n9ikcbdu2tXiVVVaJ2gYPHmzxTjvtZPGcOXMK2vdqsOyyy1rsl0zQZRdmz54dtV155ZUWs7RCw+Hv\n67Qq1BFHHBG1NWrUyGL9XeBT7a+44gqLi11+oVmzZhZrldT+/ftH/XRZF5+KWV+YiQMAAAAAAJAB\nPMQBAAAAAADIAB7iAAAAAAAAZEDm18QphxYtWlh80003WbzIIvEzLy1/TR5r8R577LFoe/vtt6+1\n31133RVt+3K7yIZOnToltum6KFg4iy325+m90DVw/NpS++67r8U+77xQuibOJZdcYvFVV10V9Vt6\n6aUt9t+Dxx9/3OLx48cXtR9Z1bdvX4v1Mwohvj6Vm66xdMABB1j866+/Rv0uvPBCi6tt/aJK0ZKo\nGnt+jYB33323bPtUbXbeeedoW8u361pQfg2HQuk6LNtss03Utummm9b6Nw899FBR71WtllxyyWhb\n1xS6+uqrE/9OyxXffvvtFuu5OoQQ1lprrcTX0LVayrmeUpbtvvvuFv/973+P2rTs95Zbbhm1zZ07\nt7w7hqL489hpp51msa6BE0IIU6dOtVjXpn377beLem9d62b11VeP2vS35dNPP22xXwdX+f0dOHCg\nxZVcC5CZOAAAAAAAABnAQxwAAAAAAIAMIJ2qFscdd5zFWgbXlzP/6KOPKrZPebPqqqta7KeD6xRX\nTeHQafohhDBv3rwy7R1KTad/H3rooVHbyJEjLX7++ecrtk/4nZam9iVpi02hSqJpUZqSE0IIG2+8\ncUnfK6uaNGkSbSelToRQfKpGMbQ8vKbnjRkzJur30ksvVWyfqlWhY6WS3488uvbaa6PtHj16WNyy\nZcuoTUu961T7XXfdtaj31tfwpcPVp59+arEvcY10Wh7c03Q5n/KfpFu3bgW/95tvvmkx97K1S0sV\n1fvGKVOmVGJ3sJA0pSmE+VOx1S+//GLxJptsYnGfPn2ifuuuu26tf//9999H2+utt16tcQjxfe7K\nK6+cuE9qxowZ0XZ9pZEzEwcAAAAAACADeIgDAAAAAACQAaRThRD+8pe/RNt+FfQ/6ErpIYTw/vvv\nl22f8u7hhx+2uFmzZon97r77bourrSpNnvTs2dPipk2bRm1DhgyxWKs+oHR8ZT2lU1XLTVME/D6l\n7WP//v0tPvDAA0u+Xw2Jr5iy2mqrWXzfffdVendM27Zta/3vXAcrLy1toxSVkfC7ESNGRNsbbLCB\nxV26dInadtxxR4u16sqsWbOifnfeeWdB763VTkaNGpXY7/XXX7eYe6S68edTTX3TlEWfsqEVNvfY\nYw+LfTUbHYu+7cgjj7RYj/WHH35Y0L5XA586o3S8nXvuuVHb4MGDLaYiX8Px3//+N9rW1Gv9jRBC\nCGussYbF1113ncVpqaWanuVTt9IkpVD99ttv0fajjz5q8QknnBC1TZs2reD3KyVm4gAAAAAAAGQA\nD3EAAAAAAAAygIc4AAAAAAAAGcCaOCGEXr16RduLL764xS+++KLFb7zxRsX2KY8033ijjTZK7Pfy\nyy9b7HNdkU2dO3e22Oe0PvTQQ5Xenapw9NFHW+xze+tL7969Ld5www2jNt1Hv7+6Jk7effPNN9G2\n5vTrmhwhxOtLzZkzp6T70aJFi2g7aX2CYcOGlfR9UbstttjC4v333z+x39y5cy2m9G5pffnllxbr\neg5++4wzzljo91prrbUs1rXEQojPCaeeeupCv1e1euGFF6JtHTu67o1fpyZpXQ7/escdd5zFTz75\nZNS29tprW6zra+h1u9o1b97cYn9PoGvHnXPOOVHbWWedZfEtt9xisZZ1DyFed2XcuHEWf/DBB4n7\n1KFDh2hbfxdyvk3ny37relIrrLBC1KZr0+q6tV988UXUb9KkSRbrd0J/c4QQQvfu3eu8vwMGDIi2\nzzzzTIt1vav6xEwcAAAAAACADOAhDgAAAAAAQAZUbTpV48aNLdZSdSGE8NNPP1ms6Tw///xz+Xcs\nR3zpcJ2Kpilrnk4VnjdvXul3DBWxyiqrWLzlllta/NFHH0X9tGwfSkdTlypJp0CHEML6669vsZ4D\n0viyvNV07vVTjrVs8F577RW1PfXUUxZfddVVdX6vjh07RtuawtGmTZuoLSmFoKGk6uWdXk8XWST5\n/789//zzldgdlJmmiPixp+la/lyJwvkU1L333ttiTfNu0qRJ4mtcf/31Fvs0uh9++MHiRx55JGrT\ndJEddtjB4rZt20b9qrls/JVXXmnxKaecUvDf6fnx2GOPrTUuFR1/uhTEvvvuW/L3yjOfnqTjoxh3\n3XVXtJ2WTqUp7Po9u+OOO6J+WsK8oWAmDgAAAAAAQAbwEAcAAAAAACADeIgDAAAAAACQAVW7Js5p\np51msS91O2TIEItff/31iu1T3vztb3+LtjfeeONa+z322GPRNmXF8+GQQw6xWMsVP/PMM/WwN6iU\nf/zjH9G2lllNM2HCBIsPPvjgqE3LSFYbPR/6UsM777yzxffdd1+dX3v27NnRtq69sdJKKxX0Gj5v\nHOWRVOLdryVw6623VmJ3UGJ9+/aNtg866CCLdc2GEOYvs4vS0BLhOt7233//qJ+OOV27SNfA8S64\n4IJoe7311rN41113rfX1Qpj/WlhNdF2UBx54IGq79957LV5ssfin7Oqrr25x2vphpaBrAOp3Rsuc\nhxDChRdeWNb9QAinn366xXVZk+joo4+2uJj7qPrETBwAAAAAAIAM4CEOAAAAAABABlRNOpVOOw8h\nhLPPPtvir7/+Omo7//zzK7JPeVdoScC//vWv0TZlxfOhdevWtf73L7/8ssJ7gnJ7+umnLV5nnXWK\neo0PP/zQ4mHDhi30PuXF2LFjLdYSuCGE0KVLF4vbtWtX59fWMrrenXfeGW0fcMABtfbzJdFRGq1a\ntYq2fUrHH6ZMmRJtDx8+vGz7hPLZaaedEtuefPLJaPudd94p9+5UPU2t0rhY/jyp6UGaTtWjR4+o\nX9OmTS32JdHzTks6+/Na+/btE/9uu+22s3jxxRe3uH///lG/pCUeiqXpzl27di3pa6N2RxxxhMWa\nwuZT7NQHH3wQbT/yyCOl37EKYSYOAAAAAABABvAQBwAAAAAAIANynU7VrFkzi6+77rqobdFFF7VY\nUwFCCOHNN98s744hotNFQwjh559/rvNrzJ07N/E1dDplkyZNEl9jhRVWiLYLTQfTKZ9nnHFG1Pbd\nd98V9Bp5tMsuu9T635944okK70l10qm9aRUa0qbxDxgwwOKWLVsm9tPX/+233wrdxUjv3r2L+rtq\n9u6779Yal8Knn35aUL+OHTtG2++//35J96Nabb755tF20hj21R2RTf48/O2331r8z3/+s9K7gzIb\nNGiQxZpOtc8++0T9dLkBlnoozIsvvljrf9f04xDidKpffvnF4ttvvz3q969//cvik046KWpLSnNF\neXTv3j3a1nPjsssum/h3ukyHVqMKIYQff/yxRHtXeczEAQAAAAAAyAAe4gAAAAAAAGQAD3EAAAAA\nAAAyIHdr4uhaN0OGDLF4zTXXjPqNHz/eYi03jsobPXr0Qr/Ggw8+GG1PmzbN4pVXXtlin29catOn\nT4+2L7roorK+X0OyxRZbRNurrLJKPe0JQgjh5ptvtvjyyy9P7Kfla9PWsyl0rZtC+91yyy0F9UP9\n0DWVatv+A2vglIeu6efNnj3b4muvvbYSu4My0LUZ9D4lhBBmzpxpMSXF80evk3p93m233aJ+5557\nrsX3339/1Pbxxx+Xae/y6bnnnou29f5cS1IfeeSRUb927dpZvM022xT0XlOmTCliD7Egfu3E5ZZb\nrtZ+uqZYCPG6U6+99lrpd6yeMBMHAAAAAAAgA3iIAwAAAAAAkAG5S6dq27atxV27dk3sp+WjNbUK\npeNLt/tpoqXUt2/fov5OywqmpYE8/vjjFg8fPjyx36uvvlrUfuTBHnvsEW1rauPIkSMtfuWVVyq2\nT9XskUcesfi0006L2po3b1629501a1a0PWbMGIuPOuooizXlEQ1PTU1N6jbKa4cddkhsmzRpksVz\n586txO6gDDSdyo+vp556KvHvNIVgxRVXtFi/F8iOd9991+Jzzjknarviiissvvjii6O2Aw880OLv\nv/++THuXH3ovEkJc5n3vvfdO/LsePXoktv36668W65j9+9//XswuohZ6vjv99NML+pt77rkn2n75\n5ZdLuUsNBjNxAAAAAAAAMoCHOAAAAAAAABnAQxwAAAAAAIAMyPyaOK1bt462fQm5P/g1IbSsLspj\nzz33jLY1l3HxxRcv6DU6dOhgcV3Kg992220WT5gwIbHfww8/bPHYsWMLfn38bumll7a4V69eif0e\neughizWHGOUzceJEi/fdd9+obffdd7f4xBNPLOn7atnOEEK48cYbS/r6qIyllloqsY31F8pDr4u6\nvp/3ww8/WPzzzz+XdZ9QP/Q6ecABB0RtJ598ssUffPCBxQcffHD5dwxlddddd0Xb/fr1s9jfU59/\n/vkWjx49urw7lgP+unXSSSdZvOyyy1rcrVu3qF+LFi0s9r8nBg4caHH//v1LsJcIIT4eH374ocVp\nvx11DOixzTNm4gAAAAAAAGQAD3EAAAAAAAAyIPPpVFqyNoQQ1lhjjVr7DR06NNqmXGrlXX755Qv1\n9/vvv3+J9gSlolP5v/zyy6hNy7Jfe+21FdsnzM+XdddtTUH159PevXtbrMdzwIABUb9GjRpZrFNf\n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\nsKV+s2TzzTe3WNcB8GtoKP1M/OeTNsZ0PQEtP3777bdH/U499VSL77zzzqjNl1bNs7Ty7TpWQohz\nxcePH2+xlhQPIT5e+vr+eGu/tDVNlltuOYv322+/qE2vtb5EakNeJ6Wc0s4naevlJNFznJZ0D2H+\nMtNKy6Dqmh91KSmu5+i09SYa8rFOW+9J10vwa1fofYY/prfccovF7733XuJ7JSn2Wt2kSROLtYxu\nCPG1b/DgwVGbXlsb8j1MkrTrd6H874KLLrrIYj3Hpb23nnf990XPjd26dYva9Fjpekp+3KSVEU86\nrxT7XcqSpNLSIcTjVH+n+XWsdF0wXcPm22+/jfr5kuAq6Rzoj03aMdB1WbN4rIpd503PtX4tRb1H\nPeKIIyz2vx90/VM97v6eccaMGYn7N2HCBIv1nOCvrboG77rrrhu16XerX79+iftR6t8WzMQBAAAA\nAADIAB7iAAAAAAAAZEBZ0qn81HqdbqbTELVsWwghTJ482WKdBhpCPL1NpwT799KSkP/73/8s7tq1\na9RPyyuOGDEi8TXuvfdei31pM/13ffzxx1Fb0vT/LE6V8/Tf4NOYNDWt2OnUOsX/iSeeqPW/+/c+\n8MADozY9pnn4zItVin+7T0/S6YaFpiDptElN3wkhhLZt21o8ffr0qE1T8oqdlq4KTRfJG027CSGE\nQYMGWeynlCs9X2v6q6YLhBCnoPoS8lr2VtNdffnec845x2JNrQ0hvlbkPdXNf3/XWWcdi7V8dAjx\nZ/juu+9a7Kd/J6WL+GOVVmpazwOaGtC5c+eon6ZQ6TTxEPJ/7JIkff4hxOMvLWVR6bVwxx13THw9\nf87U8rg6nutynUjax7ycT/V77kt269j06TxffPGFxcWk/qaVvfXHR1NUL7vsMou32mqrqN/w4cNr\njf3rZ1Ep7m38Pf2GG25Yaz+fFnrSSSdZ/NFHH1nsy4i3adPGYl2aIYQQdtppJ4sHDhxosf6+CaG4\nNO883vP6VLVdd93VYp+K8+ijj1qsv0n856LXJx3baSkw/vpc6Dk7Tdavi/5z1WOl/zb/G65ly5YW\n9+/fP2rbYYcdLNbznU91GzVqlMX6e9Hfo+o9UdrvVv1eXXPNNVE/3X//u2jttde2WO+r/P6WGjNx\nAAAAAAAAMoCHOAAAAAAAABlQlnSqtJXRdQqqVpny22kre2ubn8al6VWaMvDQQw8l9kt7DT/FNWl/\n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\non79+vWzWHPqQgjhueees/jf//63xWk50PidllE877zzojbNN9a1jG6//fao3+WXX25xUsl4rxxl\nvzX3UsvV+XxKvyZEQ5ZWOrYY+hr+c9F8Zs1f9qXidU2WtH1KypENofRl5LNI8+pDCGGllVay2OcR\n61oAaWt56OeaViJT1ynbZpttoraBAwdarOcA/776+oMGDYrafB56HiR97r686UsvvWTxjBkzojbN\n89Y1qHy5Yr1m6tobb775ZtSvcePGFjdv3jxxfzX2axVU0/hLWpurFJ+Bvy9Zf/31a31ff1/y4osv\nWuzz9pPWFfP/jmo6hl59leVed911o+3NN9/c4rlz50ZteowLvUfyquUY+/Osjolnn302alt55ZVr\njd95552on67bqGtopq2Tcdppp0Xbei3ceOONLda17EKIr+u+XH1DWZejlPTeTtdL9OvkaUlnf13U\na5euiaPXtxCSr2l+7Rwdm/7eU7f1nuuxxx6L+un3pJoUen7y5yP9buvvfL9ekd4bvvrqqxb766K+\nvr+f1HVw9De/X3O3IWImDgAAAAAAQAbwEAcAAAAAACADGmw6VSlKRmsKwX777Re1bb311hb7smda\nmkxTZfI4dXFh+amqWh5xzTXXjNr0eGjJYE2fCiH5c/bTGLVMuZ+yl5Re4/dXX8Ono2y11VYWb7jh\nhhaPGzcu6jdgwIBa97ch0s+i1NOp9bMMIf78NJ1qwoQJUT+dFlssTQcoR2pdFmhKUwjxZ+7Hzuqr\nr26xTjf26TU6FvVz9NOSt9hiC4vvvvvuqE3LIaelbs2cOdNiLdUZQjamtdaVfp56vvrqq6+ifnpM\n3n777ahNy+Dq+atz585RP2176623LNbp6iHE3xmf1qXpkcqX6dVjnPexl/TvK8W/W1N4Q5j/evoH\nn0owadKkgvZDx3ZSWhhihX5OSedNT9M2zjjjjKhNz7H+vFytqRmloOkYw4YNi9pGjx5tsaZc+HuU\npLGTlhKiaeMhhHD88cdbrCXj/XVc02S1nHwIccpIXn6faMrYo48+arG/79Zyz3PmzIna9Fy50047\nWbz//vtH/fSalnZvovdPPtVKrbbaaonv9d5771lcbAok5qfnSf0t6dNT9R5Sl0wJIYQ77rij1n5Z\nwJUbAAAAAAAgA3iIAwAAAAAAkAENNp2qWDolrmPHjhb7qao6bfzKK6+M2j799FOL8zJFsVz89OJO\n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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1a1efc5ef0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "n = 10\n",
    "plt.figure(figsize=(20, 6))\n",
    "for i in range(n):\n",
    "    # display original\n",
    "    ax = plt.subplot(3, n, i+1)\n",
    "    plt.imshow(X_test[i].reshape(28, 28))\n",
    "    plt.gray()\n",
    "    ax.get_xaxis().set_visible(False)\n",
    "    ax.get_yaxis().set_visible(False)\n",
    "\n",
    "    \n",
    "    # display reconstruction\n",
    "    ax = plt.subplot(3, n, i+n+1)\n",
    "    plt.imshow(decoded_imgs[i].reshape(28, 28))\n",
    "    plt.gray()\n",
    "    ax.get_xaxis().set_visible(False)\n",
    "    ax.get_yaxis().set_visible(False)\n",
    "    \n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Plot the losses"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "dict_keys(['val_loss', 'loss'])\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1a1f6b48d0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "print(history.history.keys())\n",
    "\n",
    "plt.plot(history.history['loss'])\n",
    "plt.plot(history.history['val_loss'])\n",
    "plt.title('model loss')\n",
    "plt.ylabel('loss')\n",
    "plt.xlabel('epoch')\n",
    "plt.legend(['train', 'validation'], loc='upper right')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 2. Denoising autoencoder"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "(X_train, _), (X_test, _) = mnist.load_data()\n",
    "\n",
    "X_train = X_train.reshape(X_train.shape[0], 28, 28, 1)\n",
    "X_test = X_test.reshape(X_test.shape[0], 28, 28, 1)\n",
    "\n",
    "X_train = X_train.astype(\"float32\")/255.\n",
    "X_test = X_test.astype(\"float32\")/255."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Create noisy data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "noise_factor = 0.5\n",
    "X_train_noisy = X_train + noise_factor * np.random.normal(loc=0.0, scale=1.0, size=X_train.shape) \n",
    "X_test_noisy = X_test + noise_factor * np.random.normal(loc=0.0, scale=1.0, size=X_test.shape) \n",
    "\n",
    "X_train_noisy = np.clip(X_train_noisy, 0., 1.)\n",
    "X_test_noisy = np.clip(X_test_noisy, 0., 1.)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Create the network"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 62,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "x = Input(shape=(28, 28, 1))\n",
    "\n",
    "# Encoder\n",
    "conv1_1 = Conv2D(32, (3, 3), activation='relu', padding='same')(x)\n",
    "pool1 = MaxPooling2D((2, 2), padding='same')(conv1_1)\n",
    "conv1_2 = Conv2D(32, (3, 3), activation='relu', padding='same')(pool1)\n",
    "h = MaxPooling2D((2, 2), padding='same')(conv1_2)\n",
    "\n",
    "\n",
    "# Decoder\n",
    "conv2_1 = Conv2D(32, (3, 3), activation='relu', padding='same')(h)\n",
    "up1 = UpSampling2D((2, 2))(conv2_1)\n",
    "conv2_2 = Conv2D(32, (3, 3), activation='relu', padding='same')(up1)\n",
    "up2 = UpSampling2D((2, 2))(conv2_2)\n",
    "r = Conv2D(1, (3, 3), activation='sigmoid', padding='same')(up2)\n",
    "\n",
    "autoencoder = Model(inputs=x, outputs=r)\n",
    "autoencoder.compile(optimizer='adadelta', loss='binary_crossentropy')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 63,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/svg+xml": [
       "<svg height=\"702pt\" viewBox=\"0.00 0.00 219.61 702.00\" width=\"220pt\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n",
       "<g class=\"graph\" id=\"graph0\" transform=\"scale(1 1) rotate(0) translate(4 698)\">\n",
       "<title>G</title>\n",
       "<polygon fill=\"white\" points=\"-4,4 -4,-698 215.61,-698 215.61,4 -4,4\" stroke=\"none\"/>\n",
       "<!-- 112200355568 -->\n",
       "<g class=\"node\" id=\"node1\"><title>112200355568</title>\n",
       "<polygon fill=\"none\" points=\"38.124,-657.5 38.124,-693.5 173.486,-693.5 173.486,-657.5 38.124,-657.5\" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"105.805\" y=\"-671.3\">input_10: InputLayer</text>\n",
       "</g>\n",
       "<!-- 112213224472 -->\n",
       "<g class=\"node\" id=\"node2\"><title>112213224472</title>\n",
       "<polygon fill=\"none\" points=\"39.2793,-584.5 39.2793,-620.5 172.331,-620.5 172.331,-584.5 39.2793,-584.5\" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"105.805\" y=\"-598.3\">conv2d_16: Conv2D</text>\n",
       "</g>\n",
       "<!-- 112200355568&#45;&gt;112213224472 -->\n",
       "<g class=\"edge\" id=\"edge1\"><title>112200355568-&gt;112213224472</title>\n",
       "<path d=\"M105.805,-657.313C105.805,-649.289 105.805,-639.547 105.805,-630.569\" fill=\"none\" stroke=\"black\"/>\n",
       "<polygon fill=\"black\" points=\"109.305,-630.529 105.805,-620.529 102.305,-630.529 109.305,-630.529\" stroke=\"black\"/>\n",
       "</g>\n",
       "<!-- 112212615352 -->\n",
       "<g class=\"node\" id=\"node3\"><title>112212615352</title>\n",
       "<polygon fill=\"none\" points=\"0,-511.5 0,-547.5 211.61,-547.5 211.61,-511.5 0,-511.5\" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"105.805\" y=\"-525.3\">max_pooling2d_7: MaxPooling2D</text>\n",
       "</g>\n",
       "<!-- 112213224472&#45;&gt;112212615352 -->\n",
       "<g class=\"edge\" id=\"edge2\"><title>112213224472-&gt;112212615352</title>\n",
       "<path d=\"M105.805,-584.313C105.805,-576.289 105.805,-566.547 105.805,-557.569\" fill=\"none\" stroke=\"black\"/>\n",
       "<polygon fill=\"black\" points=\"109.305,-557.529 105.805,-547.529 102.305,-557.529 109.305,-557.529\" stroke=\"black\"/>\n",
       "</g>\n",
       "<!-- 4499537200 -->\n",
       "<g class=\"node\" id=\"node4\"><title>4499537200</title>\n",
       "<polygon fill=\"none\" points=\"39.2793,-438.5 39.2793,-474.5 172.331,-474.5 172.331,-438.5 39.2793,-438.5\" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"105.805\" y=\"-452.3\">conv2d_17: Conv2D</text>\n",
       "</g>\n",
       "<!-- 112212615352&#45;&gt;4499537200 -->\n",
       "<g class=\"edge\" id=\"edge3\"><title>112212615352-&gt;4499537200</title>\n",
       "<path d=\"M105.805,-511.313C105.805,-503.289 105.805,-493.547 105.805,-484.569\" fill=\"none\" stroke=\"black\"/>\n",
       "<polygon fill=\"black\" points=\"109.305,-484.529 105.805,-474.529 102.305,-484.529 109.305,-484.529\" stroke=\"black\"/>\n",
       "</g>\n",
       "<!-- 112189965704 -->\n",
       "<g class=\"node\" id=\"node5\"><title>112189965704</title>\n",
       "<polygon fill=\"none\" points=\"0,-365.5 0,-401.5 211.61,-401.5 211.61,-365.5 0,-365.5\" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"105.805\" y=\"-379.3\">max_pooling2d_8: MaxPooling2D</text>\n",
       "</g>\n",
       "<!-- 4499537200&#45;&gt;112189965704 -->\n",
       "<g class=\"edge\" id=\"edge4\"><title>4499537200-&gt;112189965704</title>\n",
       "<path d=\"M105.805,-438.313C105.805,-430.289 105.805,-420.547 105.805,-411.569\" fill=\"none\" stroke=\"black\"/>\n",
       "<polygon fill=\"black\" points=\"109.305,-411.529 105.805,-401.529 102.305,-411.529 109.305,-411.529\" stroke=\"black\"/>\n",
       "</g>\n",
       "<!-- 112213298760 -->\n",
       "<g class=\"node\" id=\"node6\"><title>112213298760</title>\n",
       "<polygon fill=\"none\" points=\"39.2793,-292.5 39.2793,-328.5 172.331,-328.5 172.331,-292.5 39.2793,-292.5\" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"105.805\" y=\"-306.3\">conv2d_18: Conv2D</text>\n",
       "</g>\n",
       "<!-- 112189965704&#45;&gt;112213298760 -->\n",
       "<g class=\"edge\" id=\"edge5\"><title>112189965704-&gt;112213298760</title>\n",
       "<path d=\"M105.805,-365.313C105.805,-357.289 105.805,-347.547 105.805,-338.569\" fill=\"none\" stroke=\"black\"/>\n",
       "<polygon fill=\"black\" points=\"109.305,-338.529 105.805,-328.529 102.305,-338.529 109.305,-338.529\" stroke=\"black\"/>\n",
       "</g>\n",
       "<!-- 112214840096 -->\n",
       "<g class=\"node\" id=\"node7\"><title>112214840096</title>\n",
       "<polygon fill=\"none\" points=\"0,-219.5 0,-255.5 211.61,-255.5 211.61,-219.5 0,-219.5\" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"105.805\" y=\"-233.3\">up_sampling2d_7: UpSampling2D</text>\n",
       "</g>\n",
       "<!-- 112213298760&#45;&gt;112214840096 -->\n",
       "<g class=\"edge\" id=\"edge6\"><title>112213298760-&gt;112214840096</title>\n",
       "<path d=\"M105.805,-292.313C105.805,-284.289 105.805,-274.547 105.805,-265.569\" fill=\"none\" stroke=\"black\"/>\n",
       "<polygon fill=\"black\" points=\"109.305,-265.529 105.805,-255.529 102.305,-265.529 109.305,-265.529\" stroke=\"black\"/>\n",
       "</g>\n",
       "<!-- 112214695216 -->\n",
       "<g class=\"node\" id=\"node8\"><title>112214695216</title>\n",
       "<polygon fill=\"none\" points=\"39.2793,-146.5 39.2793,-182.5 172.331,-182.5 172.331,-146.5 39.2793,-146.5\" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"105.805\" y=\"-160.3\">conv2d_19: Conv2D</text>\n",
       "</g>\n",
       "<!-- 112214840096&#45;&gt;112214695216 -->\n",
       "<g class=\"edge\" id=\"edge7\"><title>112214840096-&gt;112214695216</title>\n",
       "<path d=\"M105.805,-219.313C105.805,-211.289 105.805,-201.547 105.805,-192.569\" fill=\"none\" stroke=\"black\"/>\n",
       "<polygon fill=\"black\" points=\"109.305,-192.529 105.805,-182.529 102.305,-192.529 109.305,-192.529\" stroke=\"black\"/>\n",
       "</g>\n",
       "<!-- 112220028768 -->\n",
       "<g class=\"node\" id=\"node9\"><title>112220028768</title>\n",
       "<polygon fill=\"none\" points=\"0,-73.5 0,-109.5 211.61,-109.5 211.61,-73.5 0,-73.5\" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"105.805\" y=\"-87.3\">up_sampling2d_8: UpSampling2D</text>\n",
       "</g>\n",
       "<!-- 112214695216&#45;&gt;112220028768 -->\n",
       "<g class=\"edge\" id=\"edge8\"><title>112214695216-&gt;112220028768</title>\n",
       "<path d=\"M105.805,-146.313C105.805,-138.289 105.805,-128.547 105.805,-119.569\" fill=\"none\" stroke=\"black\"/>\n",
       "<polygon fill=\"black\" points=\"109.305,-119.529 105.805,-109.529 102.305,-119.529 109.305,-119.529\" stroke=\"black\"/>\n",
       "</g>\n",
       "<!-- 112220151880 -->\n",
       "<g class=\"node\" id=\"node10\"><title>112220151880</title>\n",
       "<polygon fill=\"none\" points=\"39.2793,-0.5 39.2793,-36.5 172.331,-36.5 172.331,-0.5 39.2793,-0.5\" stroke=\"black\"/>\n",
       "<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"105.805\" y=\"-14.3\">conv2d_20: Conv2D</text>\n",
       "</g>\n",
       "<!-- 112220028768&#45;&gt;112220151880 -->\n",
       "<g class=\"edge\" id=\"edge9\"><title>112220028768-&gt;112220151880</title>\n",
       "<path d=\"M105.805,-73.3129C105.805,-65.2895 105.805,-55.5475 105.805,-46.5691\" fill=\"none\" stroke=\"black\"/>\n",
       "<polygon fill=\"black\" points=\"109.305,-46.5288 105.805,-36.5288 102.305,-46.5289 109.305,-46.5288\" stroke=\"black\"/>\n",
       "</g>\n",
       "</g>\n",
       "</svg>"
      ],
      "text/plain": [
       "<IPython.core.display.SVG object>"
      ]
     },
     "execution_count": 63,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from IPython.display import SVG\n",
    "from keras.utils.vis_utils import model_to_dot\n",
    "\n",
    "SVG(model_to_dot(autoencoder).create(prog='dot', format='svg'))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Train the network"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 64,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train on 60000 samples, validate on 10000 samples\n",
      "Epoch 1/3\n",
      "60000/60000 [==============================] - 140s - loss: 0.2005 - val_loss: 0.1380\n",
      "Epoch 2/3\n",
      "60000/60000 [==============================] - 138s - loss: 0.1247 - val_loss: 0.1186\n",
      "Epoch 3/3\n",
      "60000/60000 [==============================] - 139s - loss: 0.1149 - val_loss: 0.1124\n"
     ]
    }
   ],
   "source": [
    "epochs = 3\n",
    "batch_size = 128\n",
    "\n",
    "history = autoencoder.fit(X_train_noisy, X_train, batch_size=batch_size, epochs=epochs, verbose=1, validation_data=(X_test_noisy, X_test))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 65,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "decoded_imgs = autoencoder.predict(X_test_noisy)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Plot"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 66,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAABHEAAADnCAYAAACZmMoMAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzsnXegHVX5td8QSIEkkEAIhJAQmkjvSC8qXXoRVBAUJICg\nAkqTogbpioKCCh8ivRqagIACUkQ60msgCSSBkJBez/cHv9l59rqZybmXc4MnrOev92Tve8rM7DKT\nd72rQ61WC2OMMcYYY4wxxhjzv80Cn/UXMMYYY4wxxhhjjDFzxw9xjDHGGGOMMcYYY5oAP8Qxxhhj\njDHGGGOMaQL8EMcYY4wxxhhjjDGmCfBDHGOMMcYYY4wxxpgmwA9xjDHGGGOMMcYYY5oAP8Qxxhhj\njDHGGGOMaQL8EMcYY4wxxhhjjDGmCfBDHGOMMcYYY4wxxpgmwA9xjDHGGGOMMcYYY5qABVvVecEF\na507d46IiKWXXjpre+ONN0r/btFFF03xpEmTUjx9+vTSvyk+p2Dq1KkpXmSRRVLcpUuXrN/48eNT\n3LFjxznGERETJkxI8YIL5odhrbXWSvGTTz6Z4pVWWinr99prr5V+f7L22mun+JlnnsnavvjFL6b4\n5ZdfztpqtRrjDnV92Fzo0KFDbe69Ijp0yD9u4YUXTvHEiRNL/26FFVZIsZ7DF198sa7vyOP/7LPP\nprhr165Zv8mTJ6f4C1/4Qtb2yiuvzPE7VV2nAwcOzF6/9dZbKV5qqaVS/P7772f9OnXqlOJp06aV\nvn9EfFCr1XpXdaiXqvPYr1+/FA8bNqyu99Px/N5775X25VhabLHFUvzhhx9m/Xg8eSxbQ1t+C89H\nxFzPyRxZb731stfvvPNORHwyv0yePLnhY7F///5Z24wZM1I8YsSIT/1ZVeeXc2j37t2zfqNHj/7U\nn034Wd26dcva9PohnKN79eqV4g8++CDrN3PmzDn+TUREjx49UjxmzJh5MhbrnRv4m3RN4/nXdWzJ\nJZdMMc8p3y8inzuHDx+e4mWWWSbr99FHH6WYa7XC9UD7cb3TNW3KlCkpXmeddVL89NNPl37W4osv\nnr0u1v8PP/wwJkyYME/XRWXllVdO8auvvlrX3yy//PLZ6zfffDPFvXvPviT1ehk3blxd78/rfs01\n18zannrqqbreg9eVzgHclxBeExHV1w+/13PPPdewsbjwwgvXijVJ1zCOK16HERErrrhiirlf5f4v\nIt/TcE8aka933IfqHEXWWGONFD///POl/ZZYYonsNd+Tc3vVuq1rGuHv5DwZkR83rvcR+TU/L/ao\n3C+/9NJLWRvX0GK9jmi5znDvz3MdkZ+3WbNmlX5HznEcp1V7XD123GNz3lV4v9O3b9+sbcyYMSmu\nWj+r4PtPnDhxnqyLPBZjx47N2rgH4flQ6r3uufatuuqqWZuO73rQ9Yjf4913302xfndeTzzmEfk+\nl+exau7Qa7e4DqdNmxYzZsxoyFjs2bNnrdgjvPDCC1lb1XnifMXfsOyyy2b9uM7Uey5WWWWV7PXb\nb7+dYu6P9D6VY0f31NwvcUz16dMn68ffoufw448/nttXj4iI1VdfPcV6TGVtrWssdihbkOfEIoss\nUism0ZNPPjlr23333Uv/7mtf+1qKn3jiiRRXDbyqm/IvfelLKeYmKiLin//8Z4o5UejC9K9//SvF\nukBy08KJ9p577sn6bbvttqXfn/Ci0M01N1Ubb7xx1sZNQiMXyGKTxxvFiIgFFpidmLXQQgtlbeuv\nv36KH3744dL3v+WWW1LMjVFEvmGpYuTIkSnmININ6XPPPZfihx56KGvbfPPNU/zXv/41xbvttlvp\n515zzTXZ6/322y/FJ5xwQop/+ctfZv24edDJQY7xk7Vabf1oAFUL5HnnnZfiY445pq73O/XUU7PX\np59+emnfnj17pphj+4orrsj6/eUvf0nxt771rbq+h3L++een+Ec/+lFdf7PccstlrznJ14vOi4cf\nfnhERNx4440xatSohm9Wf/e732VtXMh/+tOfZm0cp1UbTXLaaaeVvuaisuWWW2b9Lrroorrev174\nWTrf8frR48+b22984xspvuSSS7J+vNHl30Tk8/VVV101T8Yib9h5s67wN+kmheefYy8i4sgjj0zx\nz3/+8xTreFtttdVSfPzxx6f4jDPOyPpxrnz88cdLv++6666bYn0wwE35ZpttlrX997//TTE3fvrw\nkBxwwAHZ64022igiIs4666wYOnToZ/oQ5x//+EeKt95667r+5vrrr89e77PPPikeNGhQinkjGhFx\nxx131PX+/A8HfXiu/xFSxve///0U/+lPf8ra+J8nZMMNN8xeV10//I+QpZZaqmFjsW/fvrVDDz00\nIlquYZx7eB1GRNx2220p3nnnnVOs/5lV9dDu6quvTvH999+fYj1+ZOjQoSnWdYtz4CGHHJK1/fGP\n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\np7hPnz5ZvyKlWL9vRMv040ax5JJLxje+8Y2IaJ0bHN3bON+qHHnXXXdNMefGiDw9mTKsqmuBqHyK\nc7Ry++23p1gdkQilBgqlsgcccECKt99++6wf3cjouhLR0rGmEUyePLmFPKOAc5fKjrjHGDt2bIqf\nfvrprB9d3tRtjhInymtU9sDUf65buqfiXKVzR9laoZIGrt3qSESHoCoJFaW7er1QglDlBtJallhi\niTReuAeIyOWzen4odyM777xz9prnQB1ZKGvjedR5juOIckY6t+r3VTifc03X30xpYNUaye+ocqr9\n9tsvxSr1LMapSqQ/LcW+Recjrjt6DnltU4rB8av9tttuu6yNLjjcy1KKF5FfL3w/lbFSDqauULy2\nuI9SWEqC8ill2rRpKVYHwiq5nLriNpLiOtX9OdH7BB5PSsT+9Kc/Zf123333FGvJCrbVK1/leqRy\nKspvdJ/bCDjGeF+m+06ukzpnF7K+Rsq7hg8fnmRUurfhvY5e25RTce7nuh6RS4Q5ZhXOd+pgS/dh\nomOA7nDqFMd9FEsu6NzB76HPHihL5LHSe8Iq9LlHPTgTxxhjjDHGGGOMMaYJ8EMcY4wxxhhjjDHG\nmCbAD3GMMcYYY4wxxhhjmoBWWYx37NixVtSSoRY8IrfoojYsItcyVunjSGGDXUCNP+tkPP/881m/\nNdZYY47vpxo4WuyqpSh1mLQBVCtBWlyr7pK6vccffzzFar1G3R6t0iIiOnfuHBERV199dYwcObLd\nbY2prda6DI2A18X66892Tqv3GtTaGmpRT4q6PxER//jHP0r7UQuuNXeocd9rr71SrNaiRLXN1FQ+\n99xzDbUYL7TS06dPr/vvWOPkv//9b11/o+enX79+KWZNDT1+1OezjoXWuOC5uuuuu7I2armr6i+w\nnpFactdLjx49Uqx1jwrN8uDBg+Ptt99u97F42223pVjrGnEu47W42WabZf0++OCDFGs9BGqtWe9K\nawTUa0PM2l5qD06NO/XGWveGduYKLURpq94aeF3ce++9DRuLyyyzTK34LazXExHxr3/9K8VaX4Nz\nIMdKt27dsn5nnHFG6WdvuummKab9qFqpXn311SnmWqq1HlizRmFdIo4VnfNoN8o6MRFtt94kxXee\nOHFizJw5s93HYhViCVrab+mll06x7jfK0FoVtMXeaKONUqw1glhjR2t0nHvuuSnmvP7jH/8463fO\n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\n1nWOGDEipk6d2hDLuE6dOtUKG2xqnSNybW8VtB99+umns7Z67SiphaQOOSKv36C6RsLaEVW1eKjJ\n1OvlP//5T4o32GCDrI26SVp1qsaRtYzUYlK0yQ2zb1x22WVrhXWd6saroC6bdra0OIxoaYFIeKyp\n81U7ZdYFoBU5a6vMDWrgqRV+/fXXS//mtddey16zLgR1z3rtqq6aFLUQBg0a1C72ja2hqJUVUV4r\nLKLc4l3beN1zPCh8j6p1Q+vqsKYJxyxtciNaWkKWUWUV3AraxUpVxz9/k66ZrGE0fvz4FGsNEur7\n60XXEo5v2hXrdcF6BFo/hZpvju2irlMB7V7VYpx2o0Tri7DuAG3PlUbZGi+44IK1bt26RUTL+Ym1\nbngMIvKaOG2tecY6YKxVxZoAEZ/UsytgrQjWGYzIr0Gtk7XOOuukmHNyVQ081hrR96iyNydbbLFF\n9lrquLTLWOQeLKK69gfrc7HuBGvPROTfW/eUrNnB2odqFc/aUqx3te2222b9Tj311BSz/mJEvgeu\nOgesQ6g1P7j/5jWoe9mqWiTFHvKjjz6K6dOnf6brImuC8bzpPpfzsNbzGj169BzfW88Na4JyvtN5\n7NVXX02x7mW51nKOYS2piOo9ddm513HP9aWo31Zw1FFH8WW7jEXOVxF5PcYqaLEt3zM6deqUYt2/\nci/K+iQjR47M+vG4cB/PWo8ReW1UhXVT9P3L+MMf/pC9pgU891b1rp8Rs2u0TJkyJWbNmjVPx6Le\ng7DGVisstTNoHa624uTJJ59MMfc9nGcjIk488cQ5vndEdT27Ms4444zsNecEWtcX99sF3ENobTsZ\nz7YYN8YYY4wxxhhjjJlf8EMcY4wxxhhjjDHGmCagVXKqqtQqpg8x1tdM5VPLVb7W71Vm1appUUy7\nYhq6ym00pbAeLrroouw1U3DV9ozQmu3dd9/N2piKqZaJRXr3hRdeGMOGDWtIely3bt1qRaobLdci\nIsaOHZtiPf5M86LNmqYbM8VY08vLLOr0d9MilXKzKtSillIZygI0tZYpuGrZx/R1yvuYIttKGpaq\n2qdPn9r+++8fES0lYkzpZGq49mX6X2sosyGusublOdU0dMpHKLOLyFO5mZao1+4FF1wwt6/dAk2l\n5u+qkms1SsJRb6qqpmjzt6uFPKHFuP5WQjnj0ksvnbXRSpzSNsoA9LXKI/k9qo7roosummKV5vF3\n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\nB/G8XnTRRaFNS7zrdZDnkeYdgo4n31t1vuheIq+pWjo8r4e6V6x3rld9vulv1bxD+d7RUfuNfB3o\nXNc9atH1kp9jNI9S1ctUF+UMzWOsz3ALFixwfeONN4Z+Rx55pOtTTjnFdX7W0Hth0T1N8xzle7Xe\na3v06BHaNB+gXp/NtO/J6HnVe9+4ceNCPy3/rvvQ/Dz99ddfu/7vf/8b2jTnWNmeR4jEAQAAAAAA\nAAAoAbzEAQAAAAAAAAAoAe1up9IQqdaWAdT/l0O5hwwZ4lptOitXrgz9br75Ztdaps+s8eFUGtqZ\nbT9a+jWXAS4jGva7ePHi0KZWNz0ngwcPDv00xLHeMMZ8vWgYouo8ttqmx5T7anjmc889F/p9/vnn\nLX5emSiab9kC2KtXL9dasvG4444L/TS0Uctf5utc5zAlxltP0RzI659aXvS6z/YaHQ+dD3mu6Her\nfcrM7J133nF9xRVXuNYyoGaxtGOeR818HbSmJG5r+2kIeC4jr+uvWna0PKqZ2euvv+5a1821OcZm\nQueYWoSPOuqo0E/nnJ5/Pd9m5QsHrzpFNhCdY7vsskvop1arvH5vt912rpctW+a6yDqU761l3avU\ng65V+Xfq/amt1yM959nWr+XC1SaVn2n0+PO9VduayTq3JvT3634zpztYuHCha50r+TlNn0Py9fTT\nTz+5fvPNN13Pnz8/9Js7d67rb7/9NrTV2oMVrR1VI69POl8uv/xy10X3RR3DmTNnhn5jx451rdZ9\ns2KbemeHSBwAAAAAAAAAgBLASxwAAAAAAAAAgBLASxwAAAAAAAAAgBLQ7jlx1NNXlBMnt+nfmmuj\ne/fuoZ+WiVMmTZoU/n7wwQddt4UfrtZvKypj3YiS6x2Nlqi96qqrQtvpp5/uWv3fWiLOLI6vlt3M\nuVT0XGo5TrPoOf35559b/Hez6DHWko9msSyz+lsffvjh0E/zGlWFWuXVzcwGDBjgetCgQa5zSWLN\ncaJo+XdoOzRXieYuMjMbNmyYa81JpTk5zGLJcc0zkEuR61zMuW7Uz/zhhx+6rnJOhrKQx0DXMi3J\naWb25ZdfutYxvu2220I/batCnre2Ru/7el/Mc0zRcSrKY9WIHApFezH9/Crna1gX8nnR0rea/yTv\nP3Tvs/XWW4e2fv36uV66dKnrvL/RvW0+Dl2zq5ZHSX9rLt2u57/R61NRXo8+ffqEtv79+7vW+Zzz\n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\ngBLwP9KQPkQWlkLcAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1a22742d68>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "n = 10\n",
    "plt.figure(figsize=(20, 6))\n",
    "for i in range(n):\n",
    "    # display original\n",
    "    ax = plt.subplot(3, n, i+1)\n",
    "    plt.imshow(X_test_noisy[i].reshape(28, 28))\n",
    "    plt.gray()\n",
    "    ax.get_xaxis().set_visible(False)\n",
    "    ax.get_yaxis().set_visible(False)\n",
    "\n",
    "    \n",
    "    # display reconstruction\n",
    "    ax = plt.subplot(3, n, i+n+1)\n",
    "    plt.imshow(decoded_imgs[i].reshape(28, 28))\n",
    "    plt.gray()\n",
    "    ax.get_xaxis().set_visible(False)\n",
    "    ax.get_yaxis().set_visible(False)\n",
    "    \n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Plot the losses"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 67,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "dict_keys(['val_loss', 'loss'])\n"
     ]
    },
    {
     "data": {
      "image/png": "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\nQBQYIiISkP8PCHMDlnnxGQAAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1a2170b860>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "print(history.history.keys())\n",
    "\n",
    "plt.plot(history.history['loss'])\n",
    "plt.plot(history.history['val_loss'])\n",
    "plt.title('model loss')\n",
    "plt.ylabel('loss')\n",
    "plt.xlabel('epoch')\n",
    "plt.legend(['train', 'validation'], loc='upper right')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "___"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "---"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
